2011-02-09 33 views
8

我使用Spring 3.0.4。我有一些在地圖上使用@Autowired註釋的bean。這些映射是在application-context.xml文件中定義的(因爲這些映射是使用多種工廠方法構建的)。自動裝配映射不按預期工作

當我使用我的調試器時,我可以看到使用正確的(預期的)bean id構造映射。但是,一旦自動裝配過程開始,它聲稱它找不到具有剛剛創建的id的bean。

一段代碼:

@Autowired 
@Qualifier("dienstverbandMap") 
private Map<String, String> dienstverbandMap; 

上下文XML的海賊王:

<bean class="java.util.HashMap" id="dienstverbandMap" factory-bean="someFactoryMethod" factory-method="getMappedMap"/> 

重要的細節,當我改變類型java.lang.Object中在我的課和上下文XML它既確實有線事實上,我可以將其轉換爲我的代碼中的HashMap,並讓所有的東西都能正常工作。但那不是我想要的。

任何人都得到了解釋我做錯了什麼?

回答

4

我認爲這與dienstverbandMap的類型參數有關。如果Spring能夠發現Bean實例(HashMap)實際上被實例化爲HashMap<String, String>,則只能安全地執行注入。由於bean的聲明類型是原始類型,Spring可能會丟失類型參數。

另一種可能性是工廠方法的結果簽名是錯誤的;例如映射而不是HashMap或原始HashMap而不是HashMap<String, String>

(其中的一些理論可以推翻,如果你向我們展示了工廠方法的聲明。)


順便提一下,根據彈簧豆2.0 DTD和3.0 XSD的意見,如果您提供factory-bean屬性,則不會使用class屬性。你有沒有試過完全放棄它?

+1

你說得對。我的工廠方法簽名返回Map <>,當我將其更改爲HashMap時,所有內容都開始工作。謝謝!! :) – 2011-02-09 10:51:23

+0

我想,工廠實現了一個強制返回類型爲Map(或更具體)的接口。然而,即使這樣也行不通。我必須改變界面才能使這個工作。 Yuk :) – 2011-02-09 12:28:56

0

我敢肯定,你的工廠方法返回java.util.Map,不java.util.HashMap,所以我想你也許可以做到這一點:

<bean class="java.util.Map" id="dienstverbandMap" 
     factory-bean="someFactoryMethod" factory-method="getMappedMap"/> 

免責聲明:我不知道春天會讓你做,因爲Map是一個界面,但值得一試。

+0

我試着將bean類型設置爲java.util.Map。但無濟於事。儘管感謝您的建議。 – 2011-02-09 10:27:17

5

3.11.3. Fine-tuning annotation-based autowiring with qualifiers:

報價: 如果要表達的名字註解驅動的注入,不主要使用@Autowired - 即使是在技術上能夠通過@Qualifier值指的是bean的名字。相反,更喜歡JSR-250 @Resource註釋,它的語義定義是通過其唯一名稱來標識特定的目標組件,而聲明的類型與匹配過程無關。

作爲這種語義差異的一個具體結果,本身被定義爲集合或映射類型的bean不能通過@Autowired注入,因爲類型匹配不適用於它們。對這些bean使用@Resource,通過唯一名稱引用特定的集合/映射bean。

0

地圖的bean定義不包含類型參數,所以自動佈線無法確認它是否是正確的類型。

如果您使用<util:map>您可以指定類型參數,但顯然不能使用自己的工廠方法。唯一的其他解決方案是讓你的bean需要一個原始的Map(壞的)或者顯式地在bean定義中佈線(更好)。