Spring Boot中如何在YAML配置Jackson反序列化的WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS
配置不生效的常见原因
- 手动注册了自定义的
ObjectMapperBean,覆盖了Spring Boot自动装配的实例
Spring Boot自动装配的ObjectMapper会自动加载application.yml中的spring.jackson前缀配置,一旦你通过@Bean自行声明了ObjectMapper,自动配置就会失效,配置文件中的相关属性不会被注入到你自定义的实例中。 - 项目中添加了
@EnableWebMvc注解
该注解会完全接管Spring MVC的默认配置,包括Jackson序列化/反序列化的自动配置,导致配置文件中的Jackson属性不生效。 - 配置格式错误
YAML配置不支持Tab缩进,必须使用空格缩进,同时注意配置项归属:WRITE_*开头的时间戳配置属于SerializationFeature,应放在serialization节点下;READ_*开头的属于DeserializationFeature,应放在deserialization节点下,放错节点的配置不会生效。 - 配置被更高优先级的设置覆盖
Spring Boot配置存在优先级顺序,若在启动参数、环境变量、Nacos/Apollo等远程配置中心存在同名配置,会覆盖本地application.yml的配置。
对应解决方法
场景1:自定义了ObjectMapper
使用Spring Boot提供的Jackson2ObjectMapperBuilder构建实例,自动加载配置文件中的属性:
@Bean public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { // 可在此额外添加自定义配置 return builder.build(); }
也可以直接手动关闭对应特性:
@Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.disable(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS); mapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS); // 其他自定义配置 return mapper; }
场景2:使用了@EnableWebMvc注解
如果不需要完全接管MVC配置可直接删除该注解即可恢复Jackson自动配置;如需保留注解可手动注册消息转换器:
@Configuration public class JacksonConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() .featuresToDisable( DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS ); converters.add(new MappingJackson2HttpMessageConverter(builder.build())); } }
场景3:配置格式错误
修正后的标准配置如下,注意使用空格缩进:
spring: jackson: serialization: WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS: false deserialization: READ_DATE_TIMESTAMPS_AS_NANOSECONDS: false
内容的提问来源于stack exchange,提问作者Eric Reboisson
相关产品推荐
相关产品推荐

