Преобразование @RequestBody в объект - PullRequest
7 голосов
/ 05 мая 2011

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

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

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

9 голосов
/ 05 мая 2011

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

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

1 голос
/ 21 февраля 2012

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

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

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

0 голосов
/ 08 мая 2011

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

HTH.

0 голосов
/ 07 мая 2011

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

0 голосов
/ 07 мая 2011

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

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

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

0 голосов
/ 05 мая 2011

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

<mvc:annotation-driven /> 

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

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

В-третьих, но я не уверен в этом, попробуйте изменить элементы Date в вашем POJO с типа SQL на обычный тип Java.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...