Spring 使用 Jackson 的 InstantSerializer 来写出我的 Instant 字段,如下所示:
now: "2021-04-07T10:51:53.043320Z"
不过,我不想要纳秒 - 只是毫秒。我猜想设置应用程序属性
spring.jackson.serialization.write-date-timestamps-as-nanoseconds=false
会实现这一点,但这没有什么区别。
我如何告诉 Spring/Jackson 在序列化 Instant 时省略纳秒?
(我使用的是 Spring Boot 2.2.11.RELEASE)
更新
基于这个答案,我最终得到了它的工作。我不得不使用已弃用的 JSR310Module 而不是 JavaTimeModule,并重写 createContextual(...) 方法以强制它始终使用我的序列化程序。
@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
JSR310Module jsr310Module = new JSR310Module();
jsr310Module.addSerializer(Instant.class, new MyInstantSerializer());
objectMapper.registerModule(jsr310Module);
return objectMapper;
}
private static class MyInstantSerializer extends InstantSerializer {
public MyInstantSerializer() {
super(InstantSerializer.INSTANCE, false, false,
new DateTimeFormatterBuilder().appendInstant(3).toFormatter());
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
return this;
}
}
这也有效(基于下面 Volodya 的回答):
@Bean
public Jackson2ObjectMapperBuilderCustomizer addCustomTimeSerialization() {
return jacksonObjectMapperBuilder ->
jacksonObjectMapperBuilder.serializerByType(Instant.class, new JsonSerializer<Instant>() {
private final DateTimeFormatter formatter =
new DateTimeFormatterBuilder().appendInstant(3).toFormatter();
@Override
public void serialize(
Instant instant, JsonGenerator generator, SerializerProvider provider) throws IOException {
generator.writeString(formatter.format(instant));
}
});
}