Question

Je connais comment revenir JSON de mes méthodes de @Controller en utilisant l'annotation @ResponseBody.

Maintenant, je suis en train de lire quelques arguments JSON dans mon contrôleur, mais n'a pas eu de chance jusqu'à présent. Voici la signature de mon contrôleur:

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

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

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

manuellement l'analyse syntaxique des travaux de JSON, si 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);
    }

Toutes les idées? Suis-je essayer de faire quelque chose qui est pas pris en charge?

Était-ce utile?

La solution

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

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

Vous devez décider lequel vous avez besoin. Voulez-vous vraiment avoir votre JSON comme paramètre de demande? Cela ne fonctionne normalement comment AJAX, il est normalement envoyé comme corps de la requête.

Essayez de retirer le @RequestParam et voir si cela fonctionne. Sinon, et vous êtes vraiment l'affichage de la JSON en tant que paramètre de demande, puis Spring ne vous aidera pas processus sans tuyauterie supplémentaire (voir Personnalisation webDataBinder initialisation ).

Autres conseils

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 les json2.js de Douglas Crockford d'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');
    }
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top