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

Spring Boot 2.6.13中LocalDateTime自定义序列化全局配置失效问题

问题解决:Spring Boot 2.6.13中RestController返回LocalDateTime始终为整数数组

问题原因

你遇到的核心问题是:Spring MVC模块处理接口响应时,使用的是独立维护的MappingJackson2HttpMessageConverter实例,该实例的ObjectMapper并未正确加载你自定义的序列化配置。即使你注册了JavaTimeModule Bean或标记了@Primary的ObjectMapper,也不会自动覆盖Web场景下的默认配置——因为Spring Boot的Web自动配置会通过Jackson2ObjectMapperBuilder单独构建用于HTTP消息转换的ObjectMapper。

解决方案

以下是几种全局生效的配置方式,无需为每个字段添加@JsonSerialize注解:

方式1:使用Jackson2ObjectMapperBuilderCustomizer(推荐)

这是Spring Boot官方推荐的全局定制Jackson配置的方式,会自动作用于所有Spring管理的ObjectMapper实例,包括Web场景的转换器:

@Bean
public Jackson2ObjectMapperBuilderCustomizer localDateTimeSerializerCustomizer() {
    return builder -> {
        // 注册自定义序列化器到JavaTimeModule
        JavaTimeModule timeModule = new JavaTimeModule();
        timeModule.addSerializer(new CustomLocalDateTimeSerializer());
        builder.modules(timeModule);
        
        // 或者直接指定类型对应的序列化器(更简洁)
        // builder.serializerByType(LocalDateTime.class, new CustomLocalDateTimeSerializer());
    };
}

方式2:自定义MappingJackson2HttpMessageConverter

直接替换Spring MVC使用的消息转换器,确保其使用的ObjectMapper加载自定义序列化规则:

@Bean
public MappingJackson2HttpMessageConverter customJacksonHttpMessageConverter() {
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    
    // 用Jackson2ObjectMapperBuilder构建符合Spring Boot默认配置的ObjectMapper
    ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
            .modules(new JavaTimeModule().addSerializer(new CustomLocalDateTimeSerializer()))
            .build();
    
    converter.setObjectMapper(objectMapper);
    return converter;
}

方式3:调整序列化器优先级

如果自定义序列化器未生效,可能是默认的LocalDateTimeSerializer优先级更高,可尝试显式替换模块中的序列化器:

@Bean
public Module javaTimeModule() {
    JavaTimeModule module = new JavaTimeModule();
    // 显式替换LocalDateTime的序列化器,而非追加
    module.addSerializer(LocalDateTime.class, new CustomLocalDateTimeSerializer());
    return module;
}

注:此方式需配合方式1的Customizer使用,确保该模块被Web的ObjectMapper加载

验证要点

  • 重启应用后调用RestController接口,检查返回的LocalDateTime格式是否为yyyy-MM-dd字符串
  • 排查是否有其他配置类或依赖包中的Jackson配置覆盖了自定义规则

内容的提问来源于stack exchange,提问作者Khaled

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:30:54