我正在尝试一件非常简单的事情,它看起来应该工作得很好,但我得到了一些奇怪的行为:
Application-Context.xml
<util:map id="transportMap" key-type="java.lang.String" value-type="org.cometd.client.transport.ClientTransport">
<entry key="websocket" value-ref="websocketTransport" />
<entry key="long-polling" value-ref="longPollingTransport" />
</util:map>
<bean id="cometDClient" class="com.client.CometDClient" />然后在CometDClient.java中:
@Inject
private Map<String, ClientTransport> transportMap;但是,我得到的不是"websocket":websocketTransport, "long-polling":longPollingTransport映射的映射,而是"websocketTransport":websocketTransport, "longPollingTransport":longPollingTransport。
换句话说,beans的名称被用作我的密钥!我在这里做错什么了吗?它看起来应该是足够的白痴证明,即使对我。
发布于 2013-10-04 17:36:58
尝试以下几点:
import javax.annotation.Resource;
@Resource(name = "transportMap")
private Map<String, ClientTransport> transportMap;问题是当Spring看到一个map被自动处理时,它会将该类型的bean注入到字段中,而bean名称则是映射中的键。(与List的行为相同,它会将类型的bean注入到列表中)。修复将是使用@Resource,它强制使用自动签名。
以下是Spring 参考文档的引语
作为这种语义差异的一个特定结果,本身定义为集合或映射类型的bean不能通过@Autowired注入,因为类型匹配不能正确地应用于它们。对这些bean使用@Resource,通过惟一名称引用特定的集合或映射bean。“
发布于 2013-10-04 16:24:08
我现在没有什么可以检验的,所以我要出去.
我认为Spring只“看到”您需要一个以ClientTransport-implementations作为值的映射,并将bean名称作为键,因此它实际上并不是在注入您在xml中定义的transportMap。你可以试试用
@Inject
@Qualifier("transportMap")
private Map<String, ClientTransport> transportMap;看看是否有用。
https://stackoverflow.com/questions/19185634
复制相似问题