java - 没有定义类型的唯一 bean : expected single matching bean but found 2

标签 java spring javabeans

<分区>

我在部署代码时遇到以下异常

 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.belk.api.adapter.contract.Adapter] is defined: expected single matching bean but found 2: [endeca, solar]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:800)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
    ... 64 more

我有 3 个不同的项目,一个是 Common,第二个是 Adapter,第三个是 Service。 Adapter依赖Common,Service依赖Adapter。这三个都是maven项目。 现在在我的 Common 项目中,我有一个名为 CommonAdapter.java 的接口(interface)

 public interface CommonAdapter {
    List service() ;
}

我在同一个项目中有一个名为 AdapterFactory.java 的类(即 Common)

@Component
public class AdapterFactory {
    @Autowired
    Adapter adapter;
    public Adapter getAdapter(String adapterName){
        return adapter;
    }

}   
    <context:component-scan base-package="com.test.api" />
    <bean
        class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean"
        id="adapterFactory">
        <property name="serviceLocatorInterface" value="com.test.api.adapter.manager.AdapterFactory">
        </property>
    </bean>

现在在我的适配器项目中,我有 CommonAdapter.java 的实现类 一个是 EndecaAdapetr.java,另一个是 SolarAdapter.java

@Component("endeca")
public class EndecaAdapter implements Adapter {
    List service() {
    // My bussiness logic
    }
}

@Component("solar")
public class SolarAdapter implements Adapter {
    List service() {
    // My bussiness logic
    }
}

现在在我的Service项目中,想根据输入调用上面两个类的service方法。

public class ProductSearchServiceImpl {
    @Autowired
    private AdapterFactory adapterFactory;
    public Search searchProducts(){
    Adapter endecaAdapter = this.adapterFactory
                .getAdapter("endeca ");
 }
 }

最佳答案

@Autowired 只有在确定应该注入(inject)哪个容器管理的实例时才起作用。基本上,这可以通过(至少)3 种方式实现:

  1. 只有一个容器管理的 bean 是 IS-A 声明的 Autowiring 字段的类型;
  2. 有更多容器管理的 beans 验证上述 IS-A 条件,但 Autowiring 字段也被限定(在 Spring 中,通过使用 @Qualifier 注释)
  3. 您不使用 @Autowired,而是按名称注入(inject) bean。

在您的例子中,您有两个验证 IS-A 条件的 bean:

endeca IS-A 适配器

太阳能 IS-A 适配器

因此容器没有唯一的 Autowiring 候选者,因此它在设置自身时崩溃。

关于java - 没有定义类型的唯一 bean : expected single matching bean but found 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22300102/

相关文章:

java - 通过在单词中保留 "-"而在 Java 的其他地方消除它来拆分字符串

android - 调试Android spring框架: print the sent requests

Spring Boot 登录成功后重定向到当前页面

java - jetty worker 。 Spring 申请。设置和获取环境变量

java - 在 Spring 的 Controller 中存储状态

java - BeanUtils 将 java.util.Map 转换为嵌套 bean

java - Spring WebService无效的NamespaceHandler问题(JAXWS)

java - 如何使用另一场 war 的类文件

java - 如何获取注释中其他属性的值

具有通用返回类的 Java 方法签名