Разбор JSON в Java-объектов в Spring-MVC - PullRequest
29 голосов
/ 13 октября 2010

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

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

@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'

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

Ручной анализ json работает, поэтому Джексон должен быть в пути к классам:

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

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

Ответы [ 2 ]

44 голосов
/ 13 октября 2010

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

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

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

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

4 голосов
/ 12 августа 2012

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

Java:

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

Jquery (вам нужно включить Json2.js Дугласа Крокфорда, чтобы иметь 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');
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...