簡體   English   中英

自動裝配源中的構造函數參數

[英]Constructor arguments in autowiring sources

究竟是什么原因造成的?

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

解決方法可能是這樣的:

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

由於在您的應用程序上下文中顯然有兩個KeyCardManager類型的bean,因此您需要告訴上下文連接哪個。

不幸的是,@ @Qualifier機制不適用於bean名稱,您必須使用相應的@Qualifier注釋實際的bean或在XML bean定義中添加<qualifier>元素。

@Resource批注可與bean名稱一起使用,但不支持構造函數參數(這不是Spring的錯,它是帶有@Target({TYPE, FIELD, METHOD})JSR-250標准批注)

參考:


故障排除

如果您不知道為什么在上下文中有兩個相同類型的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,這可能會導致問題)。

org.springframework.beans.factory.NoSuchBeanDefinitionException:沒有定義類型為[fi.utu.keycard.business.KeyCardManager]的唯一bean:期望的單個匹配bean,但找到2:[dataBaseTarget,數據庫]

看來您正在按類類型進行自動裝配。 但是在同一個類的上下文中有多個bean。 分別是dataBasedataBaseTarget

byType的

如果容器中恰好有一個屬性類型的bean,則允許自動裝配屬性。 如果存在多個錯誤,則將引發致命異常,這表明您不能對該bean使用byType自動裝配。 如果沒有匹配的bean,則什么也不會發生。 該屬性未設置。 如果不希望這樣做,則設置dependency-check =“ objects”屬性值將指定在這種情況下應引發錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM