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

  • 默认自动配置自动消失

  • 全局统一用你这个

相关推荐
青云计划13 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿14 小时前
Jsoniter(java版本)使用介绍
java·开发语言
Victor35614 小时前
MongoDB(9)什么是MongoDB的副本集(Replica Set)?
后端
Victor35614 小时前
MongoDB(8)什么是聚合(Aggregation)?
后端
探路者继续奋斗14 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
消失的旧时光-194315 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言
yeyeye11115 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
A懿轩A15 小时前
【Java 基础编程】Java 面向对象入门:类与对象、构造器、this 关键字,小白也能写 OOP
java·开发语言
Tony Bai16 小时前
告别 Flaky Tests:Go 官方拟引入 testing/nettest,重塑内存网络测试标准
开发语言·网络·后端·golang·php
乐观勇敢坚强的老彭16 小时前
c++寒假营day03
java·开发语言·c++