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

如何在Spring Boot中基于默认ObjectMapper配置Jackson(纯Java且不覆盖默认)

基于Spring Boot默认ObjectMapper配置Jackson的正确姿势

嗨,我来帮你搞定这个问题!在Spring Boot里,完全不用手动新建ObjectMapper,框架已经帮我们维护了一个全局的默认实例,只要正确注入就能直接用,还能轻松自定义配置让所有注入的实例都生效~

一、直接使用Spring容器的默认ObjectMapper

Spring Boot的自动配置机制已经为我们创建了一个预配置好的ObjectMapper实例,它包含了很多实用的默认设置(比如处理日期格式、空值、未知属性等)。你只需要在需要的类中通过构造方法注入(推荐方式)或者字段注入即可:

@Service
public class MyBusinessService {
    private final ObjectMapper objectMapper;

    // 构造方法注入,Spring会自动传入全局的ObjectMapper实例
    public MyBusinessService(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    // 示例:序列化对象
    public String serializeData(MyDataObject data) throws JsonProcessingException {
        return objectMapper.writeValueAsString(data);
    }
}

这样你用到的objectMapper就是Spring维护的全局实例,所有默认配置都会生效。

二、自定义默认配置(两种常用方式)

如果你需要修改Jackson的默认行为(比如调整日期格式、忽略空值、添加自定义序列化器),有两种简单的方式:

1. 通过配置文件(application.properties/yml)修改

直接在配置文件中添加spring.jackson前缀的配置项,这些设置会自动应用到全局的ObjectMapper上:

application.yml示例:

spring:
  jackson:
    # 日期格式化规则
    date-format: yyyy-MM-dd HH:mm:ss
    # 时区设置
    time-zone: GMT+8
    serialization:
      # 空Bean不报错
      fail-on-empty-beans: false
      # 格式化输出JSON
      indent-output: true
    deserialization:
      # 忽略未知属性
      fail-on-unknown-properties: false
    # 序列化时忽略空值字段
    default-property-inclusion: non_null

2. 通过配置类做复杂自定义

如果需要更灵活的配置(比如添加自定义序列化器/反序列化器、注册Jackson模块),可以创建一个Jackson2ObjectMapperBuilderCustomizer的Bean,Spring会自动用它来增强默认的ObjectMapper:

@Configuration
public class CustomJacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
        return builder -> {
            // 自定义LocalDateTime序列化格式
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
            builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
            
            // 设置序列化时忽略null值
            builder.serializationInclusion(JsonInclude.Include.NON_NULL);
            
            // 注册自定义模块(比如JodaTime模块)
            builder.modules(new JodaModule());
        };
    }
}

三、避坑提醒

千万不要自己手动new ObjectMapper()!这样创建的实例完全脱离了Spring的配置体系,只会使用Jackson原生的默认设置,这就是你之前遇到的问题根源。

只要始终使用Spring容器注入的ObjectMapper,并通过上面的方式自定义配置,所有注入的实例都会共享这些配置,完美满足你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:32:05