Java 自动布线映射未按预期工作

Java 自动布线映射未按预期工作,java,spring,ioc-container,Java,Spring,Ioc Container,我正在使用Spring3.0.4。我有一些bean在地图上使用@Autowired注释。这些映射在application-context.xml文件中定义(因为这些映射是使用几种工厂方法构建的) 当我使用我的调试器时,我可以看到映射是使用正确的(预期的)bean id构建的。但是,一旦自动连接过程启动,它就会声明找不到具有刚刚创建的id的bean 一段代码: @Autowired @Qualifier("dienstverbandMap") private Map<String, Stri

我正在使用Spring3.0.4。我有一些bean在地图上使用@Autowired注释。这些映射在application-context.xml文件中定义(因为这些映射是使用几种工厂方法构建的)

当我使用我的调试器时,我可以看到映射是使用正确的(预期的)bean id构建的。但是,一旦自动连接过程启动,它就会声明找不到具有刚刚创建的id的bean

一段代码:

@Autowired
@Qualifier("dienstverbandMap")
private Map<String, String> dienstverbandMap;
@Autowired
@限定符(“dienstverbandMap”)
私有映射dienstwerbandmap;
一段上下文xml:

<bean class="java.util.HashMap" id="dienstverbandMap" factory-bean="someFactoryMethod" factory-method="getMappedMap"/>  

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


有人知道我做错了什么吗?

我很确定您的工厂方法返回的是
java.util.Map
,而不是
java.util.HashMap
,所以我想您可能可以这样做:

<bean class="java.util.Map" id="dienstverbandMap"
      factory-bean="someFactoryMethod" factory-method="getMappedMap"/>  


免责声明:我不确定Spring是否会允许您这样做,因为
Map
是一个接口,但值得一试。

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

另一种可能是工厂方法的结果签名错误;e、 g.映射而不是HashMap,或原始HashMap而不是
HashMap

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


顺便说一下,根据SpringBeans 2.0DTD和3.0XSD中的注释,如果您提供了
工厂bean
属性,则不会使用
属性。你有没有试着把它完全省略掉?

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


这种语义差异的一个具体结果是,本身被定义为集合或映射类型的bean不能通过@Autowired注入,因为类型匹配不适用于它们。将@Resource用于此类bean,通过唯一名称引用特定的集合/映射bean。

映射的bean定义不包含类型参数,因此自动关联无法确认其类型是否正确


如果使用
可以指定类型参数,但显然不能使用自己的工厂方法。唯一的其他解决方案是使您的bean需要一个原始的
映射(不好),或者在bean定义中显式地连接映射(更好)。

我已经尝试将bean类型设置为java.util.Map。但是没有用。谢谢你的建议,你说得对。我的工厂方法签名返回Map,当我将其更改为HashMap时,一切都开始工作。谢谢!!:)我认为,工厂实现了一个接口,该接口强制返回类型为映射(或更具体)。然而,即使在那时,它也不起作用。我必须改变界面才能让它工作。Yuk:)关于@Resource注释,您还有什么推荐的文档吗?请注意,当我尝试资源注释时,它在Tomcat中运行良好,但在JBoss中不起作用。看起来@Resource注释处理程序依赖于平台。