Разбор json в java-объекты в spring-mvc

Я знаю, как вернуть json из моих методов @Controller используя аннотацию @ResponseBody .

Теперь я пытаюсь прочитать некоторые аргументы json в моем controllerе, но пока не повезло. Вот подпись моего controllerа:

 @RequestMapping(value = "/ajax/search/sync") public ModelAndView sync(@RequestParam("json") @RequestBody SearchRequest json) { 

Но когда я пытаюсь вызвать этот метод, Spring жалуется, что: Failed to convert value of type 'java.lang.String' to required type 'com.foo.SearchRequest'

Удаление annotations @RequestBody , похоже, не имеет значения.

В ручном parsingе работы json, поэтому jackson должен находиться в пути к classам:

 // 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); } 

Есть идеи? Я пытаюсь сделать что-то, что не поддерживается?

Ваш параметр должен быть либо @RequestParam , либо @RequestBody , а не оба.

@RequestBody предназначен для использования с запросами POST и PUT, где тело запроса – это то, что вы хотите проанализировать. @RequestParam предназначен для именованных параметров, как по URL-адресу, так и в виде представления в виде многостраничной формы.

Поэтому вам нужно решить, какой из них вам нужен. Вы действительно хотите, чтобы ваш JSON был параметром запроса? Обычно это не работает AJAX, его обычно отправляют как тело запроса.

Попробуйте удалить @RequestParam и посмотреть, работает ли это. Если нет, и вы действительно отправляете JSON в качестве параметра запроса, то Spring не поможет вам обработать это без дополнительной сантехники (см. Настройка инициализации WebDataBinder ).

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

Ява:

 @RequestMapping(value = "/ajax/search/sync") public ModelAndView sync(@RequestBody SearchRequest 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'); } }); 
  • Spring MVC: сложный объект как GET @RequestParam
  • Статус HTTP 406. Spring MVC 4.0, jQuery, JSON
  • Весенний совет АОП по аннотированным controllerам
  • Как использовать Collections.sort () в Java? (Конкретная ситуация)
  • ServletContext и Spring MVC
  • REST с полной привязкой данных Spring и Jackson
  • Отключить Spring Security для OPTIONS Http Method
  • Кодировка символов JSON
  • Как обрабатывать HTTP OPTIONS с помощью Spring MVC?
  • Многостраничный запрос Spring MVC с JSON
  • Spring 3.0 MVC binding Enums Case Sensitive
  • Давайте будем гением компьютера.