SpringMVC处理Java8新日期类参数

发布时间 2023-12-22 10:51:41作者: yanggdgg

SpringMVC如何将request参数自动封装为LocalDate和LocalDateTime

在使用SpringMVC时,java.util.Date类型字段可以使用@DateTimeFormat注解将application/x-www-from-urlencoded类型的请求中的字符串进行自动转换。而Java 8中新的时间类型该如何支持呢?

在application/x-www-from-urlencoded(键值对)请求中自动转换新时间类型

Spring4.0开始,Spring的context模块包中增加了Jsr310DateTimeFormatAnnotationFormatterFactory工厂类。该类是对@DateTimeFormat注解的JSR310标准扩展支持。因此,在Spring4.0之后,可以直接使用@DateTimeFormat注解标注LocalDate等新时间类型字段,从而实现时间格式字符串到新时间类型的自动转换。

如:

public class SimpleRequest {
    
    private Integer id;
    
    @DateTimeFormat(iso = ISO.DATE)
    private LocalDate startDate;
    
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
}

在JSON请求中支持新时间类型的转换

如果请求的格式为application/json,则@DateTimeFormat注解将不再生效,取而代之的是Spring默认使用Jackson作为json的序列化工具,因此需要增加Jackson对新时间类型的反序列化器(Deserializer)来支持新时间类型的转换。

Jackson官方已经提供了对JSR310标准的支持包,只需在pom文件中添加以下配置引入依赖(版本自选):

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.3</version>
</dependency>

然后在需要反序列化(序列化)的对象字段上添加@JsonDeserialize(using = LocalDateDeserializer.class)@JsonSerialize(using = LocalDateSerializer.class))注解,Jackson便会使用该反序列化器将json字段反序列化成LocalDate类型。

如:

public class SimpleRequest {
    
    private Integer id;
    
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate startDate;
    
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    private LocalDateTime startTime;
}

在Spring Boot 2.0之后,将默认依赖spring-boot-starter-json包,该依赖包括了jackson-datatype-jsr310在内的3种json实用工具包,因此不需要再手动添加依赖

转自:简书-小花的胖次