2016-08-04 156 views
0

我有一個消耗jar的項目A讓我們說B.jar(其中B是另一個項目在我們的項目A中用作依賴項),現在有一個Bean(一種Spring-gemfire緩存) ,它將所有必需的數據保存在地圖中。 這個映射bean被項目使用(在我的項目中包含爲jar),即B讀取緩存屬性,但我無法做到這一點幫助?項目乙在外部jar彈簧依賴注入

<!-- Injecting bean in our A application --> 
    <bean id="foo" class="com.abc.solutions.Foo" init-method="loadFoo"> 
      <property name="bar1" ref="gemFireBean"/> 
      <property name="bar2" ref="commonBean"/> 
    </bean> 

    <bean id="b2" class="java.util.HashMap" 
     factory-bean="foo" factory-method="createB2" autowire="byName"> 
    </bean> 

上述豆B2具有

我的web應用-config.xml中在外部項目B(包括在如我的項目的JAR)一起使用。 CLAS罪項目B2

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

的一部分,但我得到

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency 

任何幫助將不勝感激。

回答

0

簡短的回答:一個HashMap(或如數組或集合任何其他通用容器)不應該是一個Spring bean。 只有業務對象應該是bean,而不是基礎設施容器。

你可以通過在你的地圖周圍建立一個自定義對象並注入它來規避這一點。在你的情況下,你應該注入你的foo bean,並以編程方式從它獲取地圖。


你的情況會發生什麼事是概括了the @Autowired section of the manual

即使輸入的地圖可以,只要與期望的密鑰類型爲字符串 自動連接。地圖值將包含預期的類型, 的所有豆類和按鍵將包含相應的bean的名字:

public class MovieRecommender { 

    private Map<String, MovieCatalog> movieCatalogs; 

    @Autowired 
    public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) { 
     this.movieCatalogs = movieCatalogs; 
    } 

    // ... 

} 

即Spring認爲你需要一個映射,其中的鍵是bean名稱,值是字符串類型的bean。