2017-01-22 8 views
2

Я создал Spring Boot Controller, который принимает объект формы события.Преобразование сериализованного поля времени HTML в java.time.LocalTime

класса
@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(); 
     } 
    } 

События выглядит следующим образом (геттеры/сеттера опущенных)

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; 
} 

Я получаю сообщение об ошибке пружинного типа рассогласования на 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.

ответ

3

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

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

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

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

+0

Спасло меня много времени. Upvoting. Добавьте соответствующие чтения (книги или учебники). Благодаря,. –

+1

@Vito, спасибо за выживание! Единственными ресурсами, которые я использовал для ответа на этот вопрос, были страницы JavaDoc, которые уже связаны из ответа. Что касается более общих материалов для чтения, я всегда считал, что общедоступная [весенняя документация] (https://spring.io/docs) неплоха. –