考虑这个SpringMVC控制器开始使用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
根据jackson留档它应该转换为ISOdatetime格式,但我仍然得到一个时间戳值…
{
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(提供程序)
的计算结果为true
,因此忽略application.properties中的属性。
知道我的代码有什么问题吗?
你就快到了。如果您用以下方式注释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.序列化.write e-dates-as-timestamps=false
,因为它现在是默认的。