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

  • 默认自动配置自动消失

  • 全局统一用你这个

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm