2012-12-19 85 views
25

我可以使用Spring做這在我的applicationContext(3.0.5):可以創建HashMap中使用Spring,但不能創建地圖

<bean id="map" class="java.util.HashMap" scope="prototype" > 
    <constructor-arg> 
     <map key-type="java.lang.String" value-type="java.lang.String"> 
      <entry key="Key 1" value="1" /> 
      <entry key="Key 2" value="2" /> 
     </map> 
    </constructor-arg> 
</bean> 

而在我的控制,我可以自動連接我的地圖是這樣的:

@Autowired 
@Qualifier("map") 
private HashMap<String, String> map; 

它工作正常,但如果我這樣做:

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

我得到:

所致: org.springframework.beans.factory.NoSuchBeanDefinitionException:否 匹配類型的豆[java.lang.String中]找到的依賴性[圖 與值java.lang.String類型]:在預期至少有1個bean,其中 有資格作爲此依賴關係的自動導向候選。依賴 註解: {@ org.springframework.beans.factory.annotation.Autowired(所需=真), @ org.springframework.beans.factory.annotation.Qualifier(值=地圖)}

我問題是:爲什麼我無法使用接口自動裝配我的地圖?

謝謝。

+1

沒有地圖的一個bean ID,這就是混亂 – NimChimpsky

+1

真正的問題是:一個地圖不應該是一個Spring bean在所有第一個地方。服務應該是bean,數據不應該。如果你真的想要一個地圖bean,創建一個包含地圖並注入地圖的bean。 –

+0

@SeanPatrickFloyd爲什麼不可以注入任何東西並獲得好處。那裏沒有負面影響? (假設你給它一個描述性的名字) – NimChimpsky

回答

35

使用@Resource代替@Autowired

@Resource(name="map") 
private HashMap<String, String> map; 

退房尖端雖然聲明類型集合的一個豆,一個無法通過@Autowired注入它。見下面的文檔從彈簧:

4.11.3 Fine-tuning annotation-based autowiring with qualifiers

作爲該語義差別的一個特定的結果,豆類其是 本身定義爲一個集合或地圖類型不能通過 注入@Autowired因爲類型匹配是不適用於他們。使用 @Resource for such beans,參考特定集合/地圖 bean的唯一名稱。

代替@Autowired因此,使用@Resource

@Resource 
@Qualifier("map") 
private Map<String, String> map; 
+1

但是我不能在構造函數參數上使用@Resource。我需要通過構造函數 – Harish