Json parsing en objets Java au printemps-mvc
-
29-09-2019 - |
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?
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');
}
});