首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring定义的映射以bean名称作为键,而不是指定的键值。

Spring定义的映射以bean名称作为键,而不是指定的键值。
EN

Stack Overflow用户
提问于 2013-10-04 15:56:16
回答 2查看 3.4K关注 0票数 2

我正在尝试一件非常简单的事情,它看起来应该工作得很好,但我得到了一些奇怪的行为:

Application-Context.xml

代码语言:javascript
复制
<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中:

代码语言:javascript
复制
@Inject
private Map<String, ClientTransport> transportMap;

但是,我得到的不是"websocket":websocketTransport, "long-polling":longPollingTransport映射的映射,而是"websocketTransport":websocketTransport, "longPollingTransport":longPollingTransport

换句话说,beans的名称被用作我的密钥!我在这里做错什么了吗?它看起来应该是足够的白痴证明,即使对我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-04 17:36:58

尝试以下几点:

代码语言:javascript
复制
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。“

票数 6
EN

Stack Overflow用户

发布于 2013-10-04 16:24:08

我现在没有什么可以检验的,所以我要出去.

我认为Spring只“看到”您需要一个以ClientTransport-implementations作为值的映射,并将bean名称作为键,因此它实际上并不是在注入您在xml中定义的transportMap。你可以试试用

代码语言:javascript
复制
@Inject
@Qualifier("transportMap")
private Map<String, ClientTransport> transportMap;

看看是否有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19185634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档