【问题标题】:Spring Boot: Default serialization for java.time.Duration changed from String to NumberSpring Boot:java.time.Duration 的默认序列化从 String 更改为 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的,没有进入序列化命名空间……
  • 尽管如此,问题仍然是为什么默认行为发生了变化。

标签: java spring-boot serialization 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

【讨论】:

  • 就是这样,我们同时也找到了该物业。无论如何,谢谢您提供详细信息。
猜你喜欢
  • 2013-04-18
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 2013-09-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多