自动装配地图无法按预期工作

Ste*_*iks 8 java spring ioc-container

我正在使用Spring 3.0.4.我有一些在地图上使用@Autowired注释的bean.这些映射在application-context.xml文件中定义(因为这些映射是使用多个工厂方法构造的).

当我使用我的调试器时,我可以看到使用正确的(预期的)bean id构建映射.但是,一旦自动装配过程开始,它声称它找不到具有刚刚创建的id的bean.

一段代码:

@Autowired
@Qualifier("dienstverbandMap")
private Map<String, String> dienstverbandMap;
Run Code Online (Sandbox Code Playgroud)

一段上下文xml:

<bean class="java.util.HashMap" id="dienstverbandMap" factory-bean="someFactoryMethod" factory-method="getMappedMap"/>  
Run Code Online (Sandbox Code Playgroud)

重要的细节,当我在我的类和上下文xml中将类型更改为java.lang.Object时,它确实已经连接了实际上,我可以将其转换为代码中的HashMap并使一切正常工作.但这显然不是我想要的.

有人解释我做错了吗?

Erh*_*mir 5

3.11.3.使用限定符微调基于注释的自动装配:

Quote:如果您打算按名称表达注释驱动注入,请不要主要使用@Autowired - 即使技术上能够通过@Qualifier值引用bean名称.相反,更喜欢JSR-250 @Resource注释,该注释在语义上定义为通过其唯一名称标识特定目标组件,声明的类型与匹配过程无关.

作为这种语义差异的特定结果,自身定义为集合或映射类型的bean不能通过@Autowired注入,因为类型匹配不适用于它们.对这样的bean使用@Resource,通过唯一名称引用特定的collection/map bean.


Ste*_*n C 4

我认为这与 的类型参数有关dienstverbandMap。只有当 Spring 能够确定 bean 实例 (a HashMap) 实际上被实例化为 a 时,注入才能安全地执行HashMap<String, String>。Spring 可能会丢失类型参数,因为 bean 的声明类型是原始类型。

另一种可能是工厂方法的结果签名错误;例如,Map 而不是 HashMap,或者原始 HashMap 而不是HashMap<String, String>.

(如果您向我们展示工厂方法的声明,其中一些理论可能会被反驳。)


顺便说一句,根据 spring-beans 2.0 DTD 和 3.0 XSD 中的注释,class如果您提供属性,则不会使用该属性factory-bean。您是否尝试过完全忽略它?