You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:57:00