Parsing json in java oggetti in primavera-mvc
-
29-09-2019 - |
Domanda
ho familiarità con il modo di restituire JSON dai miei metodi @Controller
usando l'annotazione @ResponseBody
.
Ora sto cercando di leggere alcuni argomenti JSON nel mio controller, ma non hanno avuto fortuna finora. Ecco la firma di mio controller:
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") @RequestBody SearchRequest json) {
Ma quando provo a richiamare questo metodo, la primavera si lamenta che:
Failed to convert value of type 'java.lang.String' to required type 'com.foo.SearchRequest'
Rimozione della annotazioni @RequestBody
non sembra fare la differenza.
manualmente le opere JSON, in modo da Jackson deve essere nel 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);
}
Tutte le idee? Sto cercando di fare qualcosa che non è supportato?
Soluzione
Il parametro dovrebbe essere un @RequestParam
, o un @RequestBody
, non entrambi.
@RequestBody
è per l'uso con il POST e richieste PUT, dove il corpo della richiesta è ciò che si vuole analizzare. @RequestParam
è per parametri denominati, sia sul URL o come un invio di form multipart.
Quindi, è necessario decidere quale avete bisogno. Non si vuole veramente avere il vostro JSON come parametro di richiesta? Questo è normalmente non come funziona AJAX, è normalmente inviato come corpo della richiesta.
Provare a rimuovere il @RequestParam
e vedere se funziona. In caso contrario, e davvero postando il JSON come parametro di richiesta, poi primavera non sarà aiuterà a elaborare che senza impianto idraulico supplementare (vedi Personalizzazione webDataBinder inizializzazione ).
Altri suggerimenti
se si utilizza jQuery sul lato client, questo ha funzionato per me:
Java:
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestBody SearchRequest json) {
Jquery (è necessario includere json2.js di Douglas Crockford avere la funzione 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');
}
});