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.

parsing

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?

È stato utile?

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');
    }
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top