JQuery, Spring MVC @RequestBody e JSON – che funzionano insieme

Mi piacerebbe avere una serializzazione JSON-Java bidirezionale

Sto usando con successo il percorso da Java a JSON a JQuery … ( @ResponseBody ) es

 @RequestMapping(value={"/fooBar/{id}"}, method=RequestMethod.GET) public @ResponseBody FooBar getFooBar( @PathVariable String id, HttpServletResponse response , ModelMap model) { response.setContentType("application/json"); ... } 

e in JQuery che uso

 $.getJSON('fooBar/1', function(data) { //do something }); 

questo funziona bene (ad es. le annotazioni funzionano già, grazie a tutti i rispondenti)

Tuttavia, come faccio il percorso inverso : è necessario serializzare JSON su un object Java usando RequestBody?

non importa quello che provo, non riesco a ottenere qualcosa di simile a funzionare:

 @RequestMapping(value={"/fooBar/save"}, method=RequestMethod.POST) public String saveFooBar(@RequestBody FooBar fooBar, HttpServletResponse response , ModelMap model) { //This method is never called. (it does when I remove the RequestBody...) } 

Ho configurato correttamente Jackson (si serializza sulla via d’uscita) e ho MVC impostato come annotazioni guidate, naturalmente

Come posso farlo funzionare? è ansible a tutti? o è Spring / JSON / JQuery è oneway (fuori)?


Aggiornare:

Ho cambiato questa impostazione di Jackson

       <!--  -->    

A quello (quasi simile) suggerito

         

E sembra funzionare! Non so cosa abbia fatto esattamente il trucco, ma funziona …

Sono abbastanza sicuro che devi solo registrare MappingJacksonHttpMessageConverter

(il modo più semplice per farlo è attraverso in XML o @EnableWebMvc in Java )

Vedere:

  • questo post sul forum e
  • 7.6.5 Configurazione della formattazione in Spring MVC

Ecco un esempio funzionante:

Maven POM

  4.0.0testjsonwar 0.0.1-SNAPSHOTjson test   org.springframeworkspring-webmvc3.0.5.RELEASE   org.codehaus.jacksonjackson-mapper-asl1.4.2    org.apache.maven.pluginsmaven-compiler-plugin 2.3.21.61.6 org.mortbay.jettyjetty-maven-plugin 7.4.0.v20110414   

nella cartella src / main / webapp / WEB-INF

web.xml

  json org.springframework.web.servlet.DispatcherServlet 1   json /*   

JSON-servlet.xml

    

nella cartella src / main / resources:

MVC-context.xml

     

Nella cartella src / main / java / test / json

TestController.java

 @Controller @RequestMapping("/test") public class TestController { @RequestMapping(method = RequestMethod.POST, value = "math") @ResponseBody public Result math(@RequestBody final Request request) { final Result result = new Result(); result.setAddition(request.getLeft() + request.getRight()); result.setSubtraction(request.getLeft() - request.getRight()); result.setMultiplication(request.getLeft() * request.getRight()); return result; } } 

Request.java

 public class Request implements Serializable { private static final long serialVersionUID = 1513207428686438208L; private int left; private int right; public int getLeft() {return left;} public void setLeft(int left) {this.left = left;} public int getRight() {return right;} public void setRight(int right) {this.right = right;} } 

Result.java

 public class Result implements Serializable { private static final long serialVersionUID = -5054749880960511861L; private int addition; private int subtraction; private int multiplication; public int getAddition() { return addition; } public void setAddition(int addition) { this.addition = addition; } public int getSubtraction() { return subtraction; } public void setSubtraction(int subtraction) { this.subtraction = subtraction; } public int getMultiplication() { return multiplication; } public void setMultiplication(int multiplication) { this.multiplication = multiplication; } } 

È ansible verificare questa configurazione eseguendo mvn jetty:run sulla riga di comando e quindi inviare una richiesta POST:

 URL: http://localhost:8080/test/math mime type: application/json post body: { "left": 13 , "right" : 7 } 

Ho usato il plugin Poster per Firefox per fare questo.

Ecco come appare la risposta:

 {"addition":20,"subtraction":6,"multiplication":91} 

Inoltre, devi anche essere sicuro di averlo

   

nel tuo xml configurazione di SPring.

Ti raccomanderei anche di leggere questo post sul blog. Mi ha aiutato molto. Spring blog – Ajax Simplifications in Spring 3.0

Aggiornare:

ho appena controllato il mio codice di lavoro in cui ho @RequestBody funziona correttamente. Ho anche questo fagiolo nella mia configurazione:

         

Potrebbe essere bello vedere cosa dice Log4j . di solito dà più informazioni e dalla mia esperienza il @RequestBody fallirà se il tipo di contenuto della tua richiesta non è Application/JSON . Puoi eseguire Fiddler 2 per testarlo, o anche il plugin per le intestazioni HTTP di Mozilla Live può aiutarti.

Oltre alle risposte qui …

se usi jquery dal lato client, questo ha funzionato per me:

Giava:

 @RequestMapping(value = "/ajax/search/sync") public String sync(@RequestBody Foo json) { 

Jquery (devi includere il file json2.js di Douglas Crockford per 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'); } }); 

Se non si desidera configurare autonomamente i convertitori di messaggi, è ansible utilizzare @EnableWebMvc o , aggiungere Jackson al classpath e Spring fornirà sia JSON, XML (e alcuni altri convertitori) di predefinito. Inoltre, otterrai alcune altre funzioni di uso comune per la conversione, la formattazione e la convalida.

Nel caso in cui si desideri utilizzare Curl per le chiamate con JSON 2 e Spring 3.2.0, verificare le domande frequenti qui . Come AnnotationMethodHandlerAdapter è deprecato e sostituito da RequestMappingHandlerAdapter.