Подтвердить что ты не робот

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

Я знаю, как вернуть 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);
    }

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Java:

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

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