gpt4 book ai didi

java - Spring 定义的映射将 bean 名称作为键而不是指定的键值

转载 作者:行者123 更新时间:2023-11-29 03:29:22 27 4
gpt4 key购买 nike

我正在尝试一个非常简单的事情,看起来应该可以正常工作,但我遇到了一些奇怪的行为:

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 映射的 map ,而是 "websocketTransport":websocketTransport, "longPollingTransport":longPollingTransport.

换句话说,bean 的名称被用作我的 key !我在这里做错了什么吗?看起来即使对我来说它也应该足够防白痴。

最佳答案

尝试以下操作:

import javax.annotation.Resource;

@Resource(name = "transportMap")
private Map<String, ClientTransport> transportMap;

问题是当 Spring 看到一个 Map 被 Autowiring 时,它会将该类型的 bean 注入(inject)到字段中,并以 bean 名称作为映射中的键。 (与 List 的行为相同,它会将类型的 bean 注入(inject)到列表中)。解决方法是使用 @Resource,它会按名称强制 Autowiring 。

这是来自 Spring reference docs 的引述:

As a specific consequence of this semantic difference, beans that are themselves defined as a collection or map type cannot be injected through @Autowired, because type matching is not properly applicable to them. Use @Resource for such beans, referring to the specific collection or map bean by unique name."

关于java - Spring 定义的映射将 bean 名称作为键而不是指定的键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19185634/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com