Преобразование сериализованного поля времени HTML в java.time.LocalTime

Я создал Spring Boot Controller, который принимает объект формы Event.

    @RestController
    @RequestMapping("/Event")
    public class EventController {

        @RequestMapping(value = "/create", method = RequestMethod.POST) 
        private synchronized List<Event> createEvent(Event inEvent) {       
            log.error("create called with event: " + inEvent);
            create(inEvent);
            return listAll();
        }
    }

Класс Event выглядит так (геттеры / сеттеры опущены)

public final class Event {
   private Integer id;
   private Integer periodId;
   private String name;
   @DateTimeFormat(pattern = "dd/MM/yyyy")
   private LocalDate eventDate;
   private LocalTime startTime;
   private LocalTime endTime;
   private Integer maxParticipants;
   private String status;
   private String eventType;  
}

Я получаю ошибку несоответствия типа Spring в полях startTime и endTime

Field error in object 'event' on field 'endTime': rejected value
[12:00] codes
 [typeMismatch.event.endTime,typeMismatch.endTime,typeMismatch.java.time.LocalTime,typeMismatch]
arguments
[org.springframework.context.support.DefaultMessageSourceResolvable:
codes [event.endTime,endTime] arguments [] default message [endTime]]
default message [Failed to convert property value of type
'java.lang.String' to required type 'java.time.LocalTime' for property
'endTime' nested exception is
org.springframework.core.convert.ConversionFailedException: Failed to
convert from type [java.lang.String] to type [java.time.LocalTime] for
value '12:00' nested exception is java.lang.IllegalArgumentException:
Parse attempt failed for value [12:00]]

Данные сериализованной формы отправляются с использованием метода jQuery AJAX. Сериализованные данные выглядят так:

eventDate=27%2F01%2F2017&eventType=REN&maxParticipants=10&startTime=09%3A00&endTime=12%3A00

Как я могу заставить Spring правильно анализировать сериализованные поля времени?

Я использую Java 8.


person tcelvis    schedule 22.01.2017    source источник


Ответы (1)


Вам потребуется предоставить DateTimeFormat аннотации к LocalTime экземплярам, ​​которые вы хотите преобразовать во время отправки формы. Эти аннотации должны указывать, что входящие данные будут придерживаться общего формата времени ISO: _ 3_.

@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
private LocalTime startTime;

@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
private LocalTime endTime;

До того, как я применил эти аннотации, я смог воспроизвести ошибку, которую вы видели. После того, как я применил эти аннотации, я смог успешно выполнить POST-отправку формы в ваш образец кода и убедиться, что он правильно создал экземпляры LocalTime.

person Chris Nauroth    schedule 23.01.2017
comment
Сэкономил мне много времени. Голосование за. Пожалуйста, добавьте релевантные чтения (книги или учебные пособия). Спасибо,. - person Witold Kaczurba; 17.03.2017
comment
@Vito, спасибо за голосование! Единственными ресурсами, которые я использовал для ответа на этот вопрос, были страницы JavaDoc, на которые уже есть ссылки из ответа. Что касается более общих материалов для чтения, я всегда считал, что общедоступная документация Spring весьма хороша. - person Chris Nauroth; 17.03.2017