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

  • 默认自动配置自动消失

  • 全局统一用你这个

相关推荐
咖啡八杯10 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
lizhongxuan11 小时前
AI Agent 上下文压缩利器 Headroom
后端
Csvn13 小时前
SSH 远程管理与安全加固 — 运维的守门之道
后端
IT_陈寒13 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
菜鸟谢14 小时前
Rust 智能指针完整详解
后端
java小白小14 小时前
SpringBoot(01): 初识SpringBoot,从Spring的痛点说起
spring boot
菜鸟谢15 小时前
Rust 函数完整知识点详解
后端
爱勇宝15 小时前
淡泊名利之前,先承认我们都很焦虑
前端·后端·程序员
菜鸟谢15 小时前
Rust 闭包(Closure)完整详解
后端
ServBay15 小时前
如何利用本地技术栈构建 0 成本 AI SaaS 雏形
后端·aigc·ai编程