2013-10-04 21 views
0

我想,看起來像它應該工作正常,但我得到一些奇怪的行爲很簡單的事情:春定義地圖有bean的名字作爲鍵,而不是指定鍵值

應用程序的context.xml

<util:map id="transportMap" key-type="java.lang.String" value-type="org.cometd.client.transport.ClientTransport"> 
    <entry key="websocket" value-ref="websocketTransport" /> 
    <entry key="long-polling" value-ref="longPollingTransport" /> 
</util:map> 
<bean id="cometDClient" class="com.client.CometDClient" /> 

然後在CometDClient.java:

@Inject 
private Map<String, ClientTransport> transportMap; 

然而,而不是用的映射地圖結束了,我得到"websocketTransport":websocketTransport, "longPollingTransport":longPollingTransport

換句話說,的名稱正在用作我的鑰匙!有什麼我在這裏做錯了嗎?即使對我來說,它看起來應該足夠白癡。

回答

1

嘗試以下操作:

import javax.annotation.Resource; 

@Resource(name = "transportMap") 
private Map<String, ClientTransport> transportMap; 

的問題是,當春看到被自動裝配一個地圖,它在該類型的豆注入到現場,與bean名稱作爲地圖的關鍵。 (與List相同的行爲,它會將該類型的bean注入到列表中)。解決方法是使用@Resource,它通過名稱強制自動裝配。

這裏是從Spring reference docs報價:

由於這種語義差異的具體結果,那是他們自己定義爲一個集合或地圖類型無法通過@Autowired注入豆,因爲類型匹配不適合他們。使用@Resource這樣的豆,指的是特定的集合或地圖bean的唯一名稱。「

1

我沒有什麼用,現在來測試這一點,肢體這樣走出去......

我覺得春天只「看到」你要求與ClientTransport -implementations爲值的映射,將bean名稱作爲鍵,所以它實際上並沒有注入你在xml中定義的transportMap。你可以嘗試使用

@Inject 
@Qualifier("transportMap") 
private Map<String, ClientTransport> transportMap; 

看看是否有幫助。

+0

@Qualifier不能用來裝飾字段明顯。謝謝你的答案。 – Dennis

相關問題