如何在Spring Boot中基于默认ObjectMapper配置Jackson(纯Java且不覆盖默认)
嗨,我来帮你搞定这个问题!在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

