Передача даты как JSON с Spring MVC и Джексоном

2

У меня есть класс с полем java.util.Date, который я хочу передать от клиента контроллеру Spring. Контроллер возвращает HTTP 415 всякий раз, когда я делаю запрос. Я попытался добавить пользовательский сериализатор, как видно из многих других вопросов, которые мне удалось найти. Пользовательский сериализатор работает, поскольку мой контроллер, который извлекает ресурс, извлекает их в пользовательском формате, но контроллер не признает JSON. Если я полностью удалю дату, контроллер работает, поэтому я знаю, что проблема связана с этим полем.

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

контроллер

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<String> addEvent(ModelMap model, @RequestBody Event event)
{
    eventService.saveEvent(event);
    return new ResponseEntity<String>(HttpStatus.CREATED);
}

Класс, который будет сериализован (getters и setter опущены, хотя я также пробовал аннотацию там.

public class Event implements Serializable
{

    private static final long serialVersionUID = -7231993649826586076L;

    private int eventID;

    private int eventTypeID;

    @JsonSerialize(using = DateSerializer.class)
    private Date date;

Serializer

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");

@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)
        throws IOException, JsonProcessingException {

    String formattedDate = dateFormat.format(date);

    gen.writeString(formattedDate);
}

И JSON, полученный моим контроллером GET (я буду более точным, когда я смогу заставить его работать вообще)

{"eventID":1,"eventTypeID":2,"date":"02-01-2014"}
  • 0
    Что говорит ваш отладчик в методе serialize?
  • 0
    org.springframework.web.HttpMediaTypeNotSupportedException: тип содержимого «application / json», не поддерживаемый, выбрасывается контроллером. Я полностью сбит с толку, так как он принимает входные данные json, если дата не указана.
Показать ещё 1 комментарий
Теги:
spring
spring-mvc
jackson

2 ответа

4
Лучший ответ

У вас есть сериализатор, но нет десериализатора, поэтому он работает только одним способом...

Вам также потребуется:

 @JsonDeserialize(using = DateDeserializer.class)

(с DateDeserializer с использованием того же формата даты).

Почему нет ни одного интерфейса для обоих, это тайна для меня: -)

  • 0
    Это не было напрямую проблемой, поскольку у меня все еще была проблема при использовании сериализатора по умолчанию (de) для поля java.util.Date. Я обнаружил проблему при тестировании десериализации. Я правильно сериализировал, но у меня был двойной установщик даты. Один принял объект Date, другой принял long. Удаление дублирующего сеттера устранило проблему. На самом деле я больше не нуждаюсь в сериализаторе или десериализаторе, так как я все время хотел использовать стандартный по умолчанию, но это очень поможет в будущем.
0

Вместо строки просто передайте объект даты из jsp, как показано ниже.

var date = new Date();
var formData = {'date':date};

И в dto сделайте переменную типа java.util.Date.

  • 0
    Нет jsp, я передаю json из не веб-приложения в приложение Spring mvc.
  • 0
    Вы можете просто вставить это, где вы делаете вызов JSON.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню