Spring项目中全局注册的Jackson自定义Date反序列化器未被调用如何解决
全局自定义Date反序列化器不生效的原因及解决方案
- 原因1:自定义ObjectMapper未被Spring优先使用
Spring Boot默认通过JacksonAutoConfiguration自动生成ObjectMapper实例,你自行new的ObjectMapper如果没有设置为优先实例,Spring MVC、RestTemplate等组件默认会使用内置生成的实例,不会触发你注册的反序列化器。
解决方案:
优先使用Jackson2ObjectMapperBuilderCustomizer扩展默认配置,该方式会保留Spring所有自动配置逻辑,仅自定义你需要的规则:
@Bean public Jackson2ObjectMapperBuilderCustomizer dateDeserializerCustomizer() { return builder -> { SimpleModule dateModule = new SimpleModule(); dateModule.addDeserializer(Date.class, new DateDeserializer()); builder.modules(dateModule) .featuresToDisable( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES ); }; }
如果你仍希望自行声明ObjectMapper实例,需在@Bean注解上添加@Primary强制Spring优先使用该实例:
@Bean @Primary public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addDeserializer(Date.class, new DateDeserializer()); mapper.registerModule(module); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false); mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false); mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false); return mapper; }
- 原因2:日期类型匹配错误
你当前注册的是java.util.Date类型的反序列化器,若实体类中使用的是java.sql.Date、java.time.LocalDate/LocalDateTime等其他日期类型,或者反序列化时出现泛型擦除导致类型不匹配,就不会触发自定义反序列化器。
解决方案:
检查实体类属性的实际日期类型,针对所有用到的日期类型分别注册对应的反序列化器即可。 - 原因3:自定义模块优先级低于内置逻辑
若你在配置文件中设置了spring.jackson.date-format等日期格式化参数,或者项目中引入了其他Jackson日期处理模块(比如JSR310时间模块),其注册的Date反序列化器优先级高于你自定义的模块,会覆盖你的配置。
解决方案:
移除配置文件中spring.jackson.date-format相关的全局日期配置,同时设置自定义模块的优先级为应用级最高:
SimpleModule dateModule = new SimpleModule(); dateModule.addDeserializer(Date.class, new DateDeserializer()); dateModule.setPriority(MODULE_PRIORITY.APPLICATION); mapper.registerModule(dateModule);
- 原因4:@EnableWebMvc覆盖默认MVC配置
若你在配置类上添加了@EnableWebMvc注解,会完全覆盖Spring Boot的默认MVC配置,导致消息转换器不会使用你自定义的ObjectMapper。
解决方案:
移除@EnableWebMvc注解使用默认MVC配置,或者手动注册消息转换器绑定自定义ObjectMapper:
@Bean public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter(ObjectMapper objectMapper) { return new MappingJackson2HttpMessageConverter(objectMapper); }
内容的提问来源于stack exchange,提问作者user3057944
相关产品推荐
相关产品推荐

