
在 Spring Boot 中,若需复用框架自动配置并经 Jackson2ObjectMapperBuilderCustomizer 定制后的 ObjectMapper,不应直接注入 ObjectMapper.class,而应注入 Jackson2ObjectMapperBuilder 并调用 build() 方法获取一致实例。
在 spring boot 中,若需复用框架自动配置并经 `jackson2objectmapperbuildercustomizer` 定制后的 `objectmapper`,不应直接注入 `objectmapper.class`,而应注入 `jackson2objectmapperbuilder` 并调用 `build()` 方法获取一致实例。
Spring Boot 的 Jackson 自动配置机制(JacksonAutoConfiguration)会创建一个 Jackson2ObjectMapperBuilder Bean,并在其生命周期中应用所有注册的 Jackson2ObjectMapperBuilderCustomizer(如您定义的 jsonCustomizer())。该 builder 是构建最终 ObjectMapper 的“模板”,它聚合了所有自定义规则(如 serializationInclusion、日期格式、序列化器等)。但请注意:直接 @Autowired ObjectMapper 获取的是一个独立构建的默认实例,它不会自动继承 Customizer 的配置——除非该 ObjectMapper Bean 显式由 builder 构建。
因此,正确做法是注入 Jackson2ObjectMapperBuilder,并在需要时调用 build() 方法生成与 Spring MVC、@RequestBody/@ResponseBody 等完全一致的 ObjectMapper 实例:
@Configuration
public class ClientConfig {
@Autowired
private Jackson2ObjectMapperBuilder jsonBuilder; // ✅ 注入 builder,而非 ObjectMapper
@Bean
public ISEAClient createPubClient() {
OkHttpClient client = new OkHttpClient();
ObjectMapper objectMapper = jsonBuilder.build(); // ✅ 复用全部定制逻辑
return new HttpRestSEAClient("http://localhost:8081/sea/", client, objectMapper);
}
}
⚠️ 注意事项:
- 不要使用 @Autowired ObjectMapper 配合 @Primary 或手动 @Bean 声明来“覆盖”默认实例,这易导致配置不一致或循环依赖;
- Jackson2ObjectMapperBuilder 是线程安全的,可安全用于多次 build() 调用(每次返回新实例,但配置完全一致);
- 若需全局共享单例 ObjectMapper,可声明一个 @Bean 依赖 Jackson2ObjectMapperBuilder,确保其与 Spring 内部使用的实例同源:
@Bean @Primary public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { return builder.build(); // 此实例将被 Spring MVC 和您的组件共用 }
通过此方式,您不仅解决了 NON_NULL 失效、日期格式未生效等问题,更保证了整个应用中 JSON 序列化行为的一致性——这是构建健壮 REST 客户端与服务端契约的关键基础。











