Spring Boot 2.5.4 如何实现按名称而非类型自动注入同类型多Bean
Spring Boot 2.5.4 多同类型ObjectMapper Bean注入异常解决
问题复现
原始配置
自定义ObjectMapper Bean配置类:
@Configuration public class MapperConfig { @Bean("yamlMapper") public ObjectMapper yamlMapper() { return new ObjectMapper(new YAMLFactory()); } @Bean("jsonMapper") public ObjectMapper jsonMapper() { return new ObjectMapper(); } }
服务类注入代码:
@Service @RequiredArgsConstructor public class MapperService { @Qualifier("jsonMapper") private final ObjectMapper jsonMapper; @Qualifier("yamlMapper") private final ObjectMapper yamlMapper; }
报错信息
启动后抛出如下异常:
No qualifying bean of type 'com.fasterxml.jackson.databind.ObjectMapper' available: expected single matching bean but found 2: yamlMapper,jsonMapper
根因分析
报错并非来自自定义的MapperService注入逻辑,而是Spring Boot自带的MappingJackson2HttpMessageConverterConfiguration类默认需要匹配唯一的ObjectMapper类型Bean,该类为框架内置类无法修改其注解配置,因此需要在自定义Bean中指定默认的主Bean供框架底层注入使用。
解决方案
通过@Primary注解指定jsonMapper作为默认的ObjectMapper主Bean即可解决冲突,调整后可正常加载上下文的配置如下:
调整后的配置类
@Configuration public class MapperConfig { @Bean public ObjectMapper yamlMapper() { return new ObjectMapper(new YAMLFactory()); } @Bean @Primary public ObjectMapper jsonMapper() { return new ObjectMapper(); } }
调整后的服务类
@Service @RequiredArgsConstructor public class MapperService { @Autowired @Qualifier("jsonMapper") private final ObjectMapper jsonMapper; @Autowired @Qualifier("yamlMapper") private final ObjectMapper yamlMapper; }
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

