【发布时间】:2021-12-29 07:47:37
【问题描述】:
我知道我不是第一个遇到这个问题的人,但我正在努力在 Spring Boot 2.5.4 中创建多个相同类型的 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
我已经尝试了其他 SO 帖子和文档中建议的 @Bean、@Qualifier 等的各种组合,但我似乎无法找到一种通过名称而不是类型来使 Spring 自动装配的方法。任何帮助将不胜感激!
解决方案:
正如 Youssef 所指出的,不是 MapperService 找不到正确的 bean,而是 Spring Boot 的 MappingJackson2HttpMessageConverterConfiguration 类。我们无法为该类添加注释,因此需要在我们的配置中使用@Primary。
上下文加载正常,如下所示:
@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;
}
【问题讨论】:
-
你可能输入了错误的
@Qualifier吗? -
抛弃lombok,自己编写一个构造函数,它的构造函数参数上有
@Qualifier。接下来,ObjectMapper也被 Spring(Boot)本身使用,因此您需要将 JSON 标记为 Primary(这也可能会破坏内容,因为这也会(部分)禁用ObjectMapper的自动配置)。跨度> -
@sotiriosdelimanolis 你已经链接了错误的答案,它是关于stackoverflow.com/questions/46548750/… 之类的问题
-
@Youssef 确实,这个问题没有包含必要的细节。替换了重复项。
标签: java spring spring-boot javabeans spring-bean