2

究竟是什么原因造成的?

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 左右。

4

2 回答 2

3

修复可能是这样的:

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

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

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

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

参考:


故障排除

如果你不知道为什么上下文中有两个相同类型的 bean,首先导航到 bean 接口(我假设KeyCardManager是一个接口,如果不是,对类做同样的事情)如果你使用Eclipse 选择Navigate > Open Type Hierarchy. 如果您发现多个继承自KeyCardManager(包括KeyCardManager其自身)的具体类,则可能是您的问题。

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

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

确保您没有手动连接org.example包装中的任何 bean(否则您将拥有双 bean,这可能会导致您遇到的问题)。

于 2011-02-04T11:54:42.127 回答
1

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

看来您正在按类类型自动装配。但是在上下文中有多个具有相同类的bean。是dataBase&dataBaseTarget

按类型

如果容器中只有一个属性类型的 bean,则允许自动装配属性。如果有多个,则会引发致命异常,这表明您可能不会对该 bean 使用 byType 自动装配。如果没有匹配的 bean,则什么也不会发生;该属性未设置。如果这是不可取的,设置 dependency-check="objects" 属性值指定在这种情况下应该抛出错误。

于 2011-02-04T11:52:28.337 回答