springboot 老项目中创建自己的myobjectMapper类,使用优先级问题

问:springboot老项目原本有使用objectmapper,自己写了个myJacksonconfig创建一个用于特殊处理的myobjectmapper,并在服务类中@qualifier指定用自己的对象。那原本代码未指定名称的会使用哪一个呢?

答:

这种写法:

  • 自己写 MyJacksonConfig ,手动 new 一个 ObjectMapper,并给它起个名字(比如 myObjectMapper )

  • 在服务类里用 @Qualifier("myObjectMapper") 或直接 @Resource 指名用它

那么:

原本没指定名字、没加 @Qualifier 的地方,依然用 SpringBoot 默认的 ObjectMapper,不会用到你自定义的。

为什么?

SpringBoot 对 ObjectMapper 的默认规则是:

  1. SpringBoot 自动配置里,自带一个 jacksonAutoConfiguration

  2. 它会注册一个 主 ObjectMapper Bean,且是 @Primary

  3. 你自己写的 myObjectMapper 只是另一个普通 Bean,没有 @Primary

所以:

  • 用 @Autowired private ObjectMapper objectMapper;

→ 注入 默认主Bean

  • 用 @Autowired @Qualifier("myObjectMapper")

→ 注入 你自己的

你现在的结构行为总结

  • 全局默认:Spring 自带的 ObjectMapper

  • 你指定名字:你自己特殊处理的 myObjectMapper

  • 两者互不干扰

如果你想让全局都用你自己的

只需要加一个 @Primary:

java

@Bean("myObjectMapper")

@Primary // 加这个

public ObjectMapper myObjectMapper() {

ObjectMapper mapper = new ObjectMapper();

// 你的特殊配置

return mapper;

}

加了之后:

  • 所有不指定名字的地方,都会用你这个

  • 原来自动配置的默认的被覆盖,现在你的是默认的

一句话记忆:

谁加 @Primary,谁就是默认;不加,默认永远是 SpringBoot 自带的那个。

======

问:如果我要给自己写的加primary,jacksonAutoConfiguration是怎么处理的?

答:给自己的 @Bean 加上 @Primary

SpringBoot 自带的 JacksonAutoConfiguration 会自动失效、不生效。

原理一句话:SpringBoot 的自动配置类 JacksonAutoConfiguration 上有个条件:

java

@ConditionalOnMissingBean(ObjectMapper.class)

意思是:

只有当容器里还没有任何 ObjectMapper Bean 时,它才会创建默认的那个。

你自己写了:

java

@Bean

@Primary

public ObjectMapper myObjectMapper() { ... }

那么:

  1. 你的 Bean 先注册

  2. JacksonAutoConfiguration 发现已经有 ObjectMapper 了

  3. 它直接跳过,不创建默认 ObjectMapper

最终效果

  • 容器里 只有你这一个 ObjectMapper

  • 所有 @Autowired ObjectMapper

→ 全都用你这个

  • 你不需要担心冲突、覆盖、混乱

你最终最稳的写法

java

@Configuration

public class MyJacksonConfig {

@Bean

@Primary // 加这个

public ObjectMapper objectMapper() { // 建议名字就叫 objectMapper,更干净

ObjectMapper mapper = new ObjectMapper();

// 你的各种配置

return mapper;

}

}

总结

  • 自己写 + @Primary

  • 默认自动配置自动消失

  • 全局统一用你这个

相关推荐
IT 行者20 小时前
实战LangChain4j集成MCP Server:让Java AI应用具备工具调用能力
java·开发语言·人工智能
ok_hahaha20 小时前
java从头开始-黑马点评-商户查询缓存
java·spring·缓存
LINgZone220 小时前
Java Mock 测试框架 Mockito
java·windows·microsoft
SWAGGY..20 小时前
【C++初阶】:(5)内存管理
java·c++·算法
XiYang-DING20 小时前
【Java SE】包装类(Wrapper Class)
java·开发语言
麦兜顶当当21 小时前
subprocess与子进程交互
java·开发语言·jvm
不能放弃治疗21 小时前
详解大模型对话 API,messages 角色 system 、user、assistant、tool
后端
等风来Boy21 小时前
JAVA集成CAS客户端总结
java·cas
hutengyi21 小时前
go测试问题记录
开发语言·后端·golang
青槿吖21 小时前
第二篇:Spring Boot进阶:整合异常处理、测试、多环境与日志,开发稳得一批!
java·spring boot·后端·spring·面试·sqlserver·状态模式