2016-08-04 157 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。