У меня есть класс с полем 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"}
У вас есть сериализатор, но нет десериализатора, поэтому он работает только одним способом...
Вам также потребуется:
@JsonDeserialize(using = DateDeserializer.class)
(с DateDeserializer с использованием того же формата даты).
Почему нет ни одного интерфейса для обоих, это тайна для меня: -)
Вместо строки просто передайте объект даты из jsp, как показано ниже.
var date = new Date();
var formData = {'date':date};
И в dto сделайте переменную типа java.util.Date.