Spring使用库定义的bean与应用程序冲突

时间:2015-08-13 14:50:00

标签: java spring autowired spring-bean

我有几个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配置。一切都是基于注释的。

3 个答案:

答案 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>