2012-03-05 55 views
0

我有一些Spring bean,其中一些在共享庫jar中。我似乎無法獲得@Qualifier的工作。當bean在另一個jar文件中時,Spring @Qualifier不工作

我有默認自動裝置設置爲「byType」,這是使用Spring 3.1.0.M2並作爲獨立的可執行文件運行。如果從共享庫中刪除「TestTwoBean」,項目將按預期執行。

的Myproj-共享lib.jar:

@Service 
public class TestOneBean implements ITestBean { 
} 

@Service 
public class TestTwoBean implements ITestBean { 
} 

myproj.jar:

@Service 
public class TestConsumerBean { 

    @Autowired @Qualifier("testOneBean") 
    private ITestBean bean; 

} 

我得到異常「與名稱的唯一豆」 在運行時:

org.springframework.beans.factory.UnsatisfiedDependencyException: 在文件[ - ]中定義的名稱爲'testConsumerBean'的bean創建時出錯: 通過bean屬性'bean'表示的不滿足的依賴關係::否 類型爲[com.myco。 ITestBean]被定義爲:期望單個 匹配bean,但找到2:[testOneBean,testTwoBean];嵌套0​​例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException:類型的無 獨特豆[com.myco.TestBean]被定義:預期單個 匹配豆但發現2:[testOneBean,testTwoBean]在 org.springframework .beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1167) ...

是否@Qualifier沒有在這種情況下工作嗎?有沒有已知的解決方法?

回答

2

您確定要按類型和註釋注入使用自動裝配嗎?按類型自動裝配意味着即使沒有註釋注入,Spring仍會嘗試使用類型查找來注入檢測到的setter和構造函數參數。

與此同時,您正試圖按名稱注入字段。您的@Service帶註釋的類生成名稱分別默認爲類名「testOneBean」和「testTwoBean」的bean。 @Qualifier使用bean名稱作爲正確匹配。推薦的「按名稱」注射的方法是使用@Resource(name="testOneBean")。由於自動裝配模式設置爲按類型(我懷疑你確實需要),所以我只能猜測彈簧嘗試按類型注入。

我建議恢復到默認自動佈線模式,並使用@Resource進行名稱佈線。

+0

一些好點。該應用程序的其餘部分最初使用零配置方法(byType autowiring,no annotations),但是這個新的重複bean問題違反了約定。看起來好像沒有簡單的方法來混合這兩種方法,所以我重構了整個代碼庫以使用嚴格的接線(default-autowire =「no」)並且註釋所有的bean。這已經解決了這個例外,並且應該避免這種類型的未來回歸。謝謝! – seanhodges 2012-03-05 12:14:25

相關問題