Spring Boot Jackson JSR-310 - ZonedDateTime 总是时间戳
Posted
技术标签:
【中文标题】Spring Boot Jackson JSR-310 - ZonedDateTime 总是时间戳【英文标题】:Spring Boot Jackson JSR-310 - ZonedDateTime always timestamp 【发布时间】:2018-04-05 15:16:13 【问题描述】:考虑这个 Spring MVC 控制器是使用 Spring Boot 开始的:
@RequestMapping("/foo")
public Foo get()
return new Foo();
public class Foo
@Getter
@Setter
private ZonedDateTime time = ZonedDateTime.now();
我想用 Jackson JSR-310 模块序列化 Foo 对象。这个依赖在类路径上:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
我的 application.properties 中也有杰克逊配置:
spring.jackson.serialization.write-dates-as-timestamps=false
根据杰克逊文档,它应该将其转换为 ISO 日期时间格式,但我仍然得到一个时间戳值......
time: 1508867114.796
我注意到 ZonedDateTimeSerializer 内部:
@Override
public void serialize(ZonedDateTime value, JsonGenerator generator, SerializerProvider provider) throws IOException
if (!useTimestamp(provider))
if (shouldWriteWithZoneId(provider))
// write with zone
generator.writeString(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(value));
return;
super.serialize(value, generator, provider);
useTimestamp(provider)
被评估为 true
,因此 application.properties 中的属性被忽略。
你知道我的代码有什么问题吗?
【问题讨论】:
如果你不需要时间戳,ZonedDateTimeSerializer 是不必要的。如果不需要,显示更多关于 useTimestamp 和 shouldWriteWithZoneId 的细节 【参考方案1】:你快到了。如果您使用
注释您的 DTOFoo
的字段 time
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
您的方法将奏效。你会得到结果:
"time": "2019-12-07T17:05:59.000+0400"
在当前的 Spring Boot 版本 (2.2.x) 中,您可以省略 application.properties 配置条目 spring.jackson.serialization.write-dates-as-timestamps=false
,因为它现在是默认设置。
【讨论】:
以上是关于Spring Boot Jackson JSR-310 - ZonedDateTime 总是时间戳的主要内容,如果未能解决你的问题,请参考以下文章
Jackson 在我的 Spring Boot 应用程序中忽略了 spring.jackson.properties
如何在 Spring Boot 1.4 中自定义 Jackson
Spring Boot没有使用Jackson Kotlin插件