0

我有一个正在使用 jar 的项目 A 可以说B.jar(其中 B 是在我们的项目 A 中用作依赖项的另一个项目),现在有一个Bean(一种Spring-gemfire缓存),它将所有需要的数据保存在地图中。项目(包括在我的项目中)正在使用这个地图 bean,jar即 B 来读取缓存属性,但我无法这样做有什么帮助吗?

我的项目 B 的 webapp-config.xml

    <!-- 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>

上面的 bean b2 必须在外部项目 B 中使用(作为 jar 包含在我的项目 A 中)。

类罪项目 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

任何帮助将不胜感激。

4

2 回答 2

0

本身定义为集合或映射类型的 Bean 不能通过 注入@Autowired,因为类型匹配不适用于它们。用于@Resource此类 bean,通过唯一名称引用特定的集合或映射 bean。

参考:bean-property-is-not-setting-from-utillist-object

和 Spring文档

于 2016-08-04T12:19:24.423 回答
0

简短的回答:a HashMap(或任何其他通用容器,如数组或集合)永远不应该是 Spring Bean。只有业务对象应该是 bean,而不是基础设施容器。

您可以通过在地图周围构建自定义对象并注入它来规避此问题。在您的情况下,您应该注入您的foobean,并以编程方式从中获取地图。


在您的情况下会发生什么是手册部分中的概述@Autowired

只要预期的键类型是字符串,即使是类型化的 Maps 也可以自动装配。Map 值将包含预期类型的​​所有 bean,并且键将包含相应的 bean 名称:

public class MovieRecommender {

    private Map<String, MovieCatalog> movieCatalogs;

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

    // ...

}

即 Spring 认为您想要一个映射,其中键是 bean 名称,值是字符串类型的 bean。

于 2016-08-04T13:35:49.020 回答