我有几个spring-boot Web应用程序和所有Web应用程序使用的单个集成库。集成库利用Spring for DI并定义了几个自己的@Bean
,并指定了明确的名称,特别是ObjectMapper
,用于从API调用中进行自己的反序列化。
以下是集成库中的ObjectMapper
bean定义(在@Configuration
类中):
@Bean(name = "Blah.APIObjectMapper")
public ObjectMapper blahAPIObjectMapper() {
ObjectMapper mapper = new ObjectMapper()
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
return mapper;
}
在图书馆的其他地方,此ObjectMapper
为@Autowired
,具有特定的@Qualifier
,如下所示:
@Autowired
@Qualifier("Blah.APIObjectMapper")
private ObjectMapper blahAPIObjectMapper;
Web应用程序中出现此问题。集成库中定义的这个自定义ObjectMapper
bean与我无法控制的默认配置的ObjectMapper
bean冲突。
错误是:
org.springframework.beans.factory.UnsatisfiedDependencyException :在类路径资源中定义名称为“mappingJackson2HttpMessageConverter”的bean时出错[org / springframework / boot / autoconfigure / web / JacksonHttpMessageConvertersConfiguration $ MappingJackson2HttpMessageConverterConfiguration.class] :通过带有[com.fasterxml.jackson.databind.ObjectMapper]类型的索引0的构造函数参数表示的不满意的依赖:::没有定义类型为[com.fasterxml.jackson.databind.ObjectMapper]的限定bean:期望的单个匹配bean但是找到了2:Blah.APIObjectMapper,_halObjectMapper;嵌套异常是org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有定义类型为[com.fasterxml.jackson.databind.ObjectMapper]的限定bean:期望的单个匹配bean但找到2:Blah.APIObjectMapper,_halObjectMapper
问:如何防止库的Blah.APIObjectMapper
与名为ObjectMapper
的spring-boot默认_halObjectMapper
发生冲突?
我没有为Spring使用任何XML配置。一切都是基于注释的。
答案 0 :(得分:0)
_halObjectMapper看起来像是由spring-hateoas通过@EnableHypermediaSupport创建的bean的名称。
如果存在多个ObjectMapper类型的bean,则Spring引用接受名为objectMapper的bean。因此,您可以通过创建名为objectMapper的第三个对象映射器bean来解决问题,甚至可以使用现有的ObjectMapper bean之一。
@Bean
public ObjectMapper objectMapper(ObjectMapper _halObjectMapper) {
return _halObjectMapper;
}
答案 1 :(得分:0)
您可以将ObjectMapper bean定义为主要提供者。这是一个例子。
@Primary
@Bean(name = "Blah.APIObjectMapper")
public ObjectMapper blahAPIObjectMapper() {
this thread讨论了问题和解决方案。
答案 2 :(得分:0)
我解决了它与Hateoas交换库的问题:
之前:
<dependency>
<groupId>org.springframework.hateoas</groupId>
<artifactId>spring-hateoas</artifactId>
</dependency>
之后:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>