设置杰克逊功能 WRITE_DATES_AS_TIMESTAMPS 在 Spring Boot 中不起作用

Posted

技术标签:

【中文标题】设置杰克逊功能 WRITE_DATES_AS_TIMESTAMPS 在 Spring Boot 中不起作用【英文标题】:Setting Jackson feature WRITE_DATES_AS_TIMESTAMPS not working in Spring Boot 【发布时间】:2018-01-18 11:00:10 【问题描述】:

我在 Spring Boot 配置中设置了 spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false,但 Jackson 序列化程序仍然为 DateTime 值生成 [1942,4,2] 而不是 "1942-04-02"

一些调试快照

org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration.StandardJackson2ObjectMapperBuilderCustomizer#customize 中有

configureFeatures(builder, this.jacksonProperties.getSerialization());

这表明“WRITE_DATES_AS_TIMESTAMPS”->“假”

然后在 org.springframework.http.converter.json.Jackson2ObjectMapperBuilder#configure 稍后会有这个循环

for (Object feature : this.features.keySet()) configureFeature(objectMapper, feature, this.features.get(feature));

this.features 又说“WRITE_DATES_AS_TIMESTAMPS”->“假”

然而在DateTime 的序列化过程中,com.fasterxml.jackson.datatype.jsr310.ser.JSR310FormattedSerializerBase#useTimestamp 显示为 false,因为 provider.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) 返回 false。

尝试修复

出于绝望,我将spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false 替换为spring.jackson.serialization.write-dates-as-timestamps=false,因为我发现很多地方都提到了这一点(尽管Boot documentation 没有暗示这一点)。那这个呢?它们似乎是同义词 - 没有效果。 在写这个问题时建议WRITE_DATES_AS_TIMESTAMPS not woking on Spring boot 1.3.5。答案是用WebMvcConfigurerAdapter 替换WebMvcConfigurationSupport。虽然这确实有帮助,但我不明白为什么会这样。

【问题讨论】:

这最后一句话是对原始问题的实际答案。 【参考方案1】:

Spring Boot 将 WebMvcConfigurationSupport bean 的存在作为您想要完全控制 Spring MVC 配置的指示。您通常会通过使用 @EnableWebMvc 来获得这样的 bean,但您也可以声明自己的 bean 或配置类,即 WebMvcConfigurationSupport

如果您将WebMvcConfigurerAdapter 子类化而不是WebMvcConfigurationSupport,则您正在对 Spring Boot 的 Spring MVC 自动配置进行附加更改,而不是完全接管。

Spring Boot 对 Spring MVC 的自动配置的一部分是将其配置为使用自动配置的 ObjectMapper 进行 HTTP 消息转换。如果您关闭 Boot 对 Spring MVC 的自动配置,它将使用自己的独立 ObjectMapper,不受任何 spring.jackson.* 配置设置的影响。

【讨论】:

为了澄清,您也应该删除 @EnableWebMvc 注释。它解决了我的问题

以上是关于设置杰克逊功能 WRITE_DATES_AS_TIMESTAMPS 在 Spring Boot 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为日期反序列化设置杰克逊时区

杰克逊 writeValue 无法解决

杰克逊映射无限递归。春季数据休息

杰克逊 - 必需的财产?

高级双向杰克逊序列化以避免无限递归

android 杰克逊 @JsonIgnore 属性