Spring 启动 LocalDate 字段序列化和反序列化

Spring Boot LocalDate field serialization and deserialization

在 Spring Boot 1.2.3.RELEASE 中使用 fasterxml 将 LocalDate 字段序列化和反序列化为 ISO 日期格式字符串的正确方法是什么?

我试过:

以上

None 有帮助。

compile ("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")

在build.gradle 然后以下注释有帮助:

@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate birthday;

更新:如果您使用的是 Spring Boot 2.*,则已通过 "starters".

之一包含依赖项

如果您想使用自定义 Java 日期格式化程序,请添加 @JsonFormat 注释。

@JsonFormat(pattern = "dd/MM/yyyy")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate birthdate;*

实际上,如果您只在 pom.xml 中指定依赖项,它就可以工作。

有了这个,我所有的 LocalDate 字段都自动使用 ISO 格式,不需要注释它们:

<!-- This is enough for LocalDate to be deserialized using ISO format -->
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

在 Spring Boot 1.5.7 上测试。

在我的 Spring Boot 2 应用程序中

  • @JsonFormat 注释在(反)序列化 JSON 数据时用于 REST 控制器。
  • @DateTimeFormat 注解在其他控制器 ModelAttributes 中(反)序列化字符串数据时使用。

您可以在同一字段上同时指定两者(如果您在 JSON 和 Thymeleaf 模板之间共享 DTO 则很有用):

@JsonFormat(pattern = "dd/MM/yyyy") 
@DateTimeFormat(pattern = "dd/MM/yyyy")
private LocalDate birthdate;

Gradle依赖性:

implementation group: 'org.springframework.boot', name: 'spring-boot-starter-json'

我希望这是在 Spring 启动 2.x 应用程序中自定义 Date/Time 格式所需的全部配置。


对于 Spring 启动 1.x 应用程序,指定额外的注释和依赖项:

@JsonFormat(pattern = "dd/MM/yyyy")
@DateTimeFormat(pattern = "dd/MM/yyyy")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate birthDate;

// or
@JsonFormat(pattern = "dd/MM/yyyy HH:mm")
@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime birthDateTime;
implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.8'

请注意,如果有人以错误的格式发送日期,您的 API 将抛出“JSON 解析错误”。映射示例:

@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate releaseDate;

异常示例:

HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.time.LocalDate from String "2002": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '2002' could not be parsed at index 4; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDate from String "2002": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '2002' could not be parsed at index 4

 @Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
    return builder -> {
        DateTimeFormatter localDateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        builder.serializerByType(LocalDate.class, new LocalDateSerializer(localDateFormatter));
        builder.deserializerByType(LocalDate.class, new LocalDateDeserializer(localDateFormatter));

        DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(localDateTimeFormatter));
        builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(localDateTimeFormatter));
    };
}