2010-11-12 10 views
1

Je fais un site web en utilisant spring mvc framework. Je veux faire un appel ajax et recevoir un objet json directement depuis mon contrôleur web. Quel est le meilleur moyen/manière/plugin de faire cela? j'ai vu les tutoriels de keith donald mais, il pense que c'est un peu compliqué. merci pour tout conseil.Quelle est la meilleure façon d'obtenir un objet json du contrôleur Web?

J'ai mis le mappeur jakson json dans mon fichier pom. mon contrôleur ressemble à:

@RequestMapping(value = "m015", method = RequestMethod.GET) 
public @ResponseBody String list(@RequestParam(value = "type", required = true) String type){ 
    List<Mail> mails = mailService.getUserMails((Long) WebHelper.getPrincipal().getUser().getId(),type); 
    logger.info("yeah"); 
    return mails.toString(); 
} 

mais je reçois ce mon javascript: [[email protected]]

mon appel ajax ressemble:

var xhrArgs = { 
url: "${ctx}/portal/mail/m015.do", 
content: { type: id }, 
headers: {'Content-Type':'application/json'}, 
handleAs: 'text', 
sync: true, 
load: function(data) { 
    alert(data); 
}, 

}; dojo.xhrGet (xhrArgs);

Qu'est-ce que j'ai manqué s'il vous plaît?

+0

Vous pouvez par exemple utiliser une bibliothèque comme jquery pour faire des appels ajax simple. – Javi

Répondre

0
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="order" value="0" /> 
    <property name="interceptors"> 
     <list> 
      <ref bean="localeChangeInterceptor" /> 
     </list> 
    </property> 
</bean> 

<!-- Enables annotated POJO @Controllers --> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonConverter" /> 
     </list> 
    </property> 
</bean> 

1

Au printemps 3.0, il est aussi simple que:

@RequestMapping("/ajax/foo") 
@ResponseBody 
public Foo foo(){ 
    return new Foo(); 
} 

Assurez-vous que vous avez une bibliothèque JSON jackson dans votre application et le printemps sera serialise le résultat JSON automagiquement.

0

La manière décrite dans le blog est en réalité très simple et élégante. Et vous pouvez réutiliser la méthode du contrôleur pour obtenir la réponse en JSON, XML etc ...

Ce que vous faites est d'annoter la méthode avec @ResponseBody et d'inclure un JSON JSON dans votre projet. Je me Maven et le faire en ajoutant cette dépendance:

<!-- Jackson JSON Mapper --> 
<dependency> 
<groupId>org.codehaus.jackson</groupId> 
<artifactId>jackson-mapper-asl</artifactId> 
<version>1.5.4</version> 
</dependency> 

La beauté dans c'est alors que la méthode du contrôleur peut renvoyer un POJO (de préférence un DTO) et le Mapper cette commande à une JSON, aussi longtemps que la requête au serveur a les bons en-têtes avec accept-encoding: application/json (ou quoi que ce soit). Il traduit même les requêtes entrantes avec le bon type de contenu au type dto dans la signature de la méthode. Beau!

Exemple d'une méthode:

@RequestMapping(value ="/service/status", method = RequestMethod.GET) 
public @ResponseBody Status getServiceStatus() { 

    return new Status("Online", 60, "Nothing to report"); 
} 

En utilisant cette approche, vous pouvez réutiliser vos méthodes (j'utiliser cela pour un api REST) ​​pour JSON, Web Services, etc ...

+0

J'ai encore un problème, j'ai mis à jour ma question, s'il vous plaît jeter un oeil. merci –

+0

Passer le .toString() et faire le type de retour Liste . –

+0

Quand je fais ainsi, j'obtiens une erreur, parce que le contrôleur essaye de retourner la vue m015 qui n'existe pas –