27 votes

Analyser JSON dans des objets Java dans Spring-MVC

Je suis familier avec la façon de retour json à partir de mon @Controller méthodes à l'aide de l' @ResponseBody d'annotation.

Maintenant, je vais essayer de lire quelques arguments json dans mon contrôleur, mais je n'ai pas eu de chance jusqu'à présent. Voici mon contrôleur de la signature:

@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") @RequestBody SearchRequest json) {

Mais quand j'essaie d'appeler cette méthode, le printemps se plaint que: Failed to convert value of type 'java.lang.String' to required type 'com.foo.SearchRequest'

Retrait de l' @RequestBody d'annotation ne semble pas faire une différence.

Manuellement de parser le json œuvres, afin Jackson doit être dans le classpath:

// This works
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") String json) {
    SearchRequest request;
    try {
        request = objectMapper.readValue(json, SearchRequest.class);
    } catch (IOException e) {
        throw new IllegalArgumentException("Couldn't parse json into a search request", e);
    }

Des idées? Suis-je en train d'essayer de faire quelque chose qui n'est pas pris en charge?

36voto

skaffman Points 197885

Votre paramètre doit être soit une @RequestParam, ou un @RequestBody, pas les deux.

@RequestBody est pour une utilisation avec les requêtes POST et PUT, où le corps de la requête est ce que vous voulez analyser. @RequestParam est pour les paramètres nommés, soit sur l'URL ou plusieurs parties de soumission de formulaire.

Donc vous devez décider lequel vous avez besoin. Voulez-vous vraiment avoir votre JSON comme un paramètre de la requête? Ce n'est normalement pas comment AJAX fonctionne, il est généralement envoyée dans le corps de la requête.

Essayez de supprimer l' @RequestParam et voir si cela fonctionne. Si non, et vous êtes vraiment à l'affichage au format JSON comme un paramètre de la requête, puis le Printemps ne sera pas vous aider à traiter que sans un complément de plomberie (voir Personnalisation de WebDataBinder d'initialisation).

4voto

rafael lean ansay Points 101

si vous utilisez jquery du côté client, cela a fonctionné pour moi:

Java:

 @RequestMapping(value = "/ajax/search/sync") 
public ModelAndView sync(@RequestBody SearchRequest json) {
 

Jquery (vous devez inclure le json2.js de Douglas Crockford pour avoir la fonction JSON.stringify):

 $.ajax({
    type: "post",
    url: "sync", //your valid url
    contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me)
    data: JSON.stringify(jsonobject), //json object or array of json objects
    success: function(result) {
        //do nothing
    },
    error: function(){
        alert('failure');
    }
});
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X