2

考虑这个使用 Spring Boot 启动的 Spring MVC 控制器:

@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 中的属性被忽略。

有什么想法我的代码有什么问题吗?

4

1 回答 1

0

你快到了。如果你用你的 DTO 注释你的time字段Foo

@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,因为它现在是默认的。

于 2019-12-07T16:07:16.570 回答