Преобразование @RequestBody в объект

Ребята, ну я сделал достаточно исследований, но я не могу найти решение этого.

в двух словах, я просто передаю url-кодированные данные формы в метод контроллера и пытаюсь преобразовать его в объект домена, который имеет дату и целые числа.

@RequestMapping(value = "/savePassport", method = RequestMethod.POST)
    public @ResponseBody
    AjaxResponse savePassport(@RequestBody StaffPassport passport, HttpServletResponse response) {

    // Some operations.

}

паспорт персонала выглядит так:

import java.sql.Date;

public class StaffPassport {

    private int staffId;
    private String passportNumber;
    private String placeOfIssue;
    private Date issueDate;
    private Date expiryDate;
    private String spouseName;
    private String oldPassportRef;
    private String visaInfo;
    private String description;
//gets/sets
}

когда я вызываю /savePassport, я получаю неподдерживаемое исключение носителя. Думаю, это связано с кастингом.

Я не могу это работает правильно. Конечно, я могу поймать отдельные данные формы с помощью @RequestParam и вручную выполнить кастинг, но это не точка фреймворка, не так ли?

где я ошибаюсь? И ты прав. Весной я новичок, но мне это нравится.

6 ответов


похоже, вы используете неправильную аннотацию. @RequestBody для принятия запроса, который имеет произвольное содержимое в своем теле, например JSON, некоторые определенные приложением XML, переменные, разделенные запятыми.. что угодно. И используя маршаллер, который вы настраиваете в сервлете диспетчера, чтобы превратить его в объекты.

Если все, что вы хотите сделать, это попросить Spring привязать обычную старую форму post к объекту backing для вас, правильная аннотация для размещения параметра метода -@ModelAttribute.


Если вы публикуете объект JSON с помощью jQuery и хотите, чтобы Spring мог обрабатывать его с помощью @RequestBody, используйте JSON.преобразовать в строки(....) в ваших данных. Вот пример:

var data = { "id": 3, "name": "test" }
$.post("processJsonData.html",JSON.stringify(data), function(data){
    ...
  }
);

Если вы не используете JSON.stringify () затем вы отправите данные в виде данных формы, и Spring сообщит вам, что у вас есть неподдерживаемый тип носителя.


прежде всего убедитесь, что у вас есть

<mvc:annotation-driven /> 

в файле конфигурации Spring. Это обязательно для работы с JSON весной MVC.

во-вторых, я рекомендую вам протестировать запрос wether на сервер с типом контента application/json. Я верю, что Fiddler2 поможет вам в этом.

в-третьих, но я не уверен в этом, попробуйте изменить элементы даты в вашем POJO С типа SQL на обычный тип java.

обновление: просто посмотрел на бланк. и похоже, что ваш HTTP-заголовок" Accept " должен быть также application / json. Пожалуйста, проверьте эту проблему с Fiddler2, а также.


Я предполагаю, что вы публикуете JSON и хотите, чтобы Spring конвертировался в StaffPassport. Если вы получаете неподдерживаемое исключение носителя, это связано с тем, что Spring не смог найти соответствующий способ выполнения преобразования.

для весны, чтобы преобразовать JSON, ему нужен Джексон - убедитесь, что у вас есть банки Джексона в вашем проекте. Если это проект на основе Maven, вы можете добавить идентификатор артефакта jackson-mapper-asl в свой pom.XML. Это должно дать вам jackson-mapper и банки Джексона.

Edit: я должен упомянуть, что это относится к Spring 3 (я недавно столкнулся с этой проблемой). Я не уверен, что еще требуется для предыдущих версий весны.


Проверьте интерфейс HttpMessageConverter и его реализации. Вы можете написать свою собственную реализацию, чтобы преобразовать ее в нужную модель домена. К тому времени, когда элемент управления попадает в ваш метод, вы можете получить к нему доступ, как если бы объект модели домена был передан.


хорошо, я думаю, что должен уточнить свой ответ. У меня нет прямого опыта использования его в проекте spring-mvc, но spring-integration. Я уверен, что применимый тип носителя (application / x-url-form-encoded) уже обработан и преобразован в MultiMap Spring framework; поэтому извлеките значения из этой, как и любой другой карты, с ключевым значением, являющимся вашей переменной формы, и заполните свою бизнес-модель.

HTH.