Преобразование @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.