设置杰克逊功能 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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章