将序列化的 HTML 时间字段转换为 java.time.LocalTime

Convert serialized HTML time field to java.time.LocalTime

我创建了一个 Spring 采用事件形式对象的引导控制器。

    @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();
        }
    }

事件 class 看起来像这样(getters/setters 省略)

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 字段上收到 Spring 类型不匹配错误

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.

您需要提供 DateTimeFormat annotation on the LocalTime instances that you want to convert during the form submission. Those annotations must indicate that the incoming data will adhere to the common ISO time format: DateTimeFormat.ISO.TIME

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

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

在应用这些注释之前,我能够重现您看到的错误。应用这些注释后,我能够 POST 向您的代码示例成功提交表单,并验证它是否正确创建了 LocalTime 个实例。