Spring Boot:java.time.Duration 的默认序列化从 String 更改为 Number
Posted
技术标签:
【中文标题】Spring Boot:java.time.Duration 的默认序列化从 String 更改为 Number【英文标题】:Spring Boot: Default serialization for java.time.Duration changed from String to Number 【发布时间】:2020-03-07 22:17:14 【问题描述】:我们最近从 Spring Boot 2.1.9 升级到了 2.2.1,这导致我们的测试失败。调查导致java.time.Duration
类型现在默认序列化不同。我们现在得到的是"900.0"
,而不是 JSON 消息中的字符串 "PT15M"
。 POJO 的定义是这样的
@JsonProperty(required = true, value = "duration")
@NotNull
private final Duration duration;
现在的问题是,是否有一些配置属性可以用来获取“旧”行为。我知道我们也可以添加注释
@JsonFormat(shape = JsonFormat.Shape.STRING)
但我更喜欢通过配置来获得它。
【问题讨论】:
您是否为此实现了自己的格式化程序? 98% 确定这是 Jackson 序列化标志; Boot 属性中有关于如何配置它们的通用文档。 没有自己的格式化程序,如果您添加注释,它可以开箱即用,使用 PT15M 使用这种格式 好消息是,我们同时找到了属性,它是 spring.jackson.serialization.write-durations-as-timestamps=false 。我是直接看spring.jackson的,没有进入序列化命名空间…… 尽管如此,问题仍然是为什么默认行为发生了变化。 【参考方案1】:当您将 spring-boot 的版本从 2.1.9 更改为 2.2.1 时,Jackson 的版本也发生了变化。从 Spring-boot 版本 2.2 开始,Jackson 版本更改为 2.10。作为此 Jackson 版本更改一部分的更改之一是使用标志 SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS
来序列化 Duration 时间戳,而不是早期的 WRITE_DATES_AS_TIMESTAMPS
。
通过向 application.properties 添加以下属性,服务(和序列化功能)的行为将类似于 2.2 之前的版本
spring.jackson.serialization.write-durations-as-timestamps=false
Springboot 2.2 Changelist
杰克逊 2.10 changelist
杰克逊Issue tracker
【讨论】:
就是这样,我们同时也找到了该物业。无论如何,谢谢您提供详细信息。以上是关于Spring Boot:java.time.Duration 的默认序列化从 String 更改为 Number的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?
《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》