2015-08-17 2 views
-1

Пошел по различным вопросам, похожим на это, но, похоже, я все делаю хорошо и все еще получаю ошибку при интерпретации объекта на сервере ... Должно быть, что-то не хватает. :)Ошибка Джексона при отправке нескольких объектов с помощью jQuery AJAX

Основы: (1) на стороне клиента - JQuery (2) на стороне сервера - Spring + Джексон

Я заинтересован в отправке объекта и логическое в теле запроса PUT. Объект построен так:

templateRequest: { 
    template: template, 
    deviceIds: deviceIds 
} 

где template является объектом сам и deviceIds представляет собой массив целых чисел. Дополнительным логическим называется shouldCheck.

Клиент отправляет данные следующим образом:

$.ajax({ 
     url: /* the REST service url */, 
     type: 'PUT', 
     dataType: 'application/json; charset=utf-8', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ 
      templateRequest: { 
       template: template, 
       deviceIds: deviceIds 
      }, 
      shouldCheck: shouldCheck 
     }), 
     complete: /* the callback function */ 
    }); 

Сервер ожидает, что это:

@RequestMapping(value = /* the required URL */, method = RequestMethod.PUT, headers = "Accept=*/*") 
@ResponseBody public boolean updateTemplate(
    @RequestBody TemplateRequest templateRequest, 
    @RequestBody Boolean shouldCheck) { 

    /* redacted */ 
} 

с TemplateRequest существа:

public class TemplateRequest { 

    private AuthenticationTemplate template; 
    private int[] deviceIds; 

    /* redacted */ 
} 

Ну, до сих пор так хорошо (или так кажется). Однако, когда я на самом деле запустить эту вещь, я получаю следующее сообщение об ошибке:

{"General Error":"Unrecognized field \"templateRequest\" (Class 
/* TemplateRequest fully qualified name */), not marked as ignorable\n at 
[Source: [email protected]; line: 1, column: 21] 
(through reference chain: /* TemplateRequest fully qualified name */[\"templateRequest\"])"} 

Кажется, я посылаю объекты неправильно. Любые предложения, как это исправить?

Большое спасибо!

+1

Я не думаю, что у вас может быть два '@ RequestBody' –

+0

Хммм. Жизнь не так проста, вы имеете в виду? :) Попробует переместить логическое значение в url. – st2rseeker

ответ

1

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

Контейнер класса

public class RequestInfo{ 
    private TemplateRequest templateRequest; 
    private Boolean shouldCheck; 

    //getters and setters 
} 

контроллер Rest

@RequestMapping(value = /* the required URL */, method = RequestMethod.PUT, headers = "Accept=*/*") 
@ResponseBody public boolean updateTemplate(
    @RequestBody RequestInfo requestInfo){ 

    /* redacted */ 
} 

Таким образом, вы можете передать любое количество объектов в одном @RequestBody.

+0

Я только что переключил один из параметров на URL, но ваш ответ хороший, поэтому я соглашусь. Благодаря! – st2rseeker

Смежные вопросы