JQuery, Spring MVC @RequestBody и JSON – заставляя работать вместе

Я хотел бы иметь двунаправленную сериализацию JSON для Java

Я успешно использую Java для JSON для JQuery пути … ( @ResponseBody ), например

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

и в JQuery я использую

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

это работает хорошо (например, annotations уже работают, благодаря всем ответчикам)

Однако, как мне сделать обратный путь: нужно ли JSON сериализоваться на объект Java с помощью RequestBody?

независимо от того, что я пытаюсь, я не могу заставить что-то вроде этого работать:

 @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...) } 

У меня jackson настроен правильно (он сериализуется на выходе), и у меня есть MVC, установленный как annotations,

Как мне заставить работать? Это вообще возможно? или Spring / JSON / JQuery является oneway (out)?


Обновить:

Я изменил настройку jacksonа

       <!--  -->    

К (почти аналогичному) предложено

         

И это работает! Я не знаю, что именно сделал трюк, но он работает …

Я уверен, что вам нужно только зарегистрировать MappingJacksonHttpMessageConverter

(самый простой способ сделать это через в XML или @EnableWebMvc в Java )

Видеть:

  • это сообщение форума и
  • 7.6.5 Настройка форматирования в Spring MVC

Вот рабочий пример:

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   

в папке src / main / webapp / WEB-INF

web.xml

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

JSON-servlet.xml

    

в папке src / main / resources:

MVC-context.xml

     

В папке 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; } } 

Вы можете проверить эту настройку, выполнив mvn jetty:run в командной строке, а затем отправить запрос POST:

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

Для этого я использовал плагин Poster Firefox .

Вот как выглядит ответ:

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

В дополнение вы также должны быть уверены, что у вас есть

   

в вашей конфигурации xml.

Я также рекомендую вам прочитать это сообщение в блоге. Это мне очень помогло. Весенний блог – Усиления Ajax весной 3.0

Обновить:

просто проверил мой рабочий код, где правильно работает @RequestBody . У меня также есть этот компонент в моей конфигурации:

         

Может быть, было бы хорошо видеть, что говорит Log4j . он обычно дает больше информации, и по моему опыту @RequestBody не удастся, если тип содержимого вашего запроса не является Application/JSON . Вы можете запустить Fiddler 2, чтобы проверить его, или может помочь плагин Mozilla Live HTTP headers.

В дополнение к ответам здесь …

если вы используете jquery на стороне клиента, это сработало для меня:

Ява:

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

JQuery (вам нужно включить json2.js Douglas Crockford для функции 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'); } }); 

Если вы не хотите самостоятельно настраивать конвертеры сообщений, вы можете использовать либо @EnableWebMvc, либо , добавить Jackson в путь к classам, а Spring предоставит вам как JSON, так и XML (и несколько других конвертеров) по умолчанию. Кроме того, вы получите некоторые другие часто используемые функции для преобразования, форматирования и проверки.

Если вы хотите использовать Curl для звонков с JSON 2 и Spring 3.2.0 в ручную проверку FAQ здесь . Поскольку AnnotationMethodHandlerAdapter устарел и заменен RequestMappingHandlerAdapter.

  • Что вызывает «java.lang.IllegalStateException: ни BindingResult, ни обычный целевой объект для bean name« command », ansible как атрибут запроса»?
  • Как получить текст ошибки в controllerе от BindingResult
  • Spring RedirectAttributes: addAttribute () vs addFlashAttribute ()
  • INFO: Нет типов Spring WebApplicationInitializer, обнаруженных на пути к classам
  • Как реализовать разбиение на страницы весной MVC 3
  • Spring MVC @PathVariable получает усечение
  • Разбор json в java-объекты в spring-mvc
  • сервер tomcat не запускает сервер и приложение в STS
  • @RequestParam vs @PathVariable
  • Как установить базовый url для restа в весенний ботинок?
  • Как правильно использовать PagedResourcesAssembler из Spring Data?
  • Давайте будем гением компьютера.