自动装配源中的构造函数参数

时间:2011-02-04 11:49:25

标签: java spring autowired

究竟是什么导致这种情况?

org.springframework.beans.factory.NoSuchBeanDefinitionException: \
No unique bean of type [fi.utu.keycard.business.KeyCardManager] \
is defined: expected single matching bean but found 2: \
[dataBaseTarget, database]

// etc. (rest of Stack Trace is irrelevant)

我需要的是自动装配3件事:验证器,ldap连接和数据库连接。

我称之为:

@Controller
Controller(KeyCardManager database,
           LdapPersonDao personManager,
           GiveFormValidator validator)

如果我更改这些参数的顺序,则错误似乎是由另一个bean引起的。我没有登录,所以我没有UserDetails左右。

2 个答案:

答案 0 :(得分:3)

修复可能是这样的:

public Controller(
    @Qualifier("beanQualifier") KeyCardManager database,
    LdapPersonDao personManager,
    GiveFormValidator validator
)

由于在您的应用程序上下文中显然有两个类型为KeyCardManager的bean,您需要告诉上下文哪一个要连接。

不幸的是,@Qualifier机制不适用于bean名称,您必须使用相应的@Qualifier注释实际的bean,或者在XML bean定义中添加<qualifier>元素。 / p>

@Resource注释适用于bean名称,但它不支持构造函数参数(这不是Spring的错误,它是JSR-250标准注释@Target({TYPE, FIELD, METHOD})

<强>参考:


故障排除

如果您不知道为什么在上下文中有两个相同类型的bean,首先导航到bean接口(我假设KeyCardManager是一个接口,如果没有,请执行相同的操作无论如何,如果你使用Eclipse,请选择Navigate > Open Type Hierarchy。如果您发现多个具体类继承自KeyCardManager(包括KeyCardManager本身),那么可能就是您的问题。

如果不是这种情况,您可能在应用程序上下文中有两个相同类型的bean。可能发生的一种方法是通过XML和classpath scanning定义bean。即如果你的XML中有这一行:

<context:component-scan base-package="org.example"/>

确保不要手动连接org.example包中的任何bean(或者你会有双豆,这会导致你遇到的问题)。

答案 1 :(得分:1)

  

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义[fi.utu.keycard.business.KeyCardManager]类型的唯一bean:期望的单个匹配bean但找到2:[dataBaseTarget,database]

您似乎按班级类型进行自动装配。但是在同一个类的上下文中有多个bean可用。这是dataBase&amp; dataBaseTarget

byType

  

如果允许属性自动装配   只有一个豆子   容器中的属性类型。如果   有一个以上,一个致命的   抛出异常,这个   表示您不能使用byType   自动装配该bean。如果有   没有匹配的豆,没有任何反应;   该物业未设定。如果是这样的话   不可取的,设置   dependency-check =“objects”属性   value指定错误   在这种情况下被抛出。