弹簧不能自动布线地图豆

2022-08-31 16:35:34

我在春天这样定义了一张地图:

<util:map id="AdditionalParams" scope="prototype" map-class="java.util.HashMap" 
          key-type="java.lang.String" value-type="java.lang.String">
    
    <entry key="Start" value="12345" />
    <entry key="Finish" value="12365" />
</util:map>

然后,我将此 Bean 自动连接到定义为以下内容的属性:

private @Autowired @Qualifier(value = "AdditionalParams") Map<String, String> additionalParams;

执行此操作时,将抛出一个异常,指出:

由以下原因引起:org.springframework.beans.factory.BeanCreationException:创建名为“DutyCreator”的bean时出错:注入自动连接的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException: Can not autowire field: private java.util.Map DutyCreator.additionalParams;嵌套的异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有找到用于依赖项的匹配的 [java.lang.String] 类型的匹配 bean [映射,其值类型为 java.lang.String]:预期至少 1 个 bean,它有资格作为此依赖项的自动连接候选项。Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=AdditionalParams)}

由以下原因引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到用于依赖项的匹配的 [java.lang.String] 类型的匹配 Bean [映射,其值类型为 java.lang.String]:预期至少 1 个 bean,它有资格作为此依赖项的自动连接候选项。Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=AdditionalParams)}

有什么想法吗?

干杯。


答案 1

从Spring 4.3开始,可以注入列表和地图,问题中的给定代码将起作用:@Autowired

也就是说,从4.3开始,集合/映射和数组类型也可以通过Spring的类型匹配算法进行匹配,只要元素类型信息保留在返回类型签名或集合继承层次结构中即可。@Autowired@Bean

但是使用较低的Spring版本,您无法自动连接这样的系列。但是,您可以执行以下操作:

@Resource(name="AdditionalParams")
private Map<String, String> additionalParams;

甚至:

@Value("#{AdditionalParams}")
private Map<String, String> additionalParams;

检查春季文档,提示部分:

本身定义为集合或映射类型的 Bean 无法通过@Autowired注入,因为类型匹配不能正确应用于它们。使用@Resource此类豆类


答案 2

似乎您的@Qualifier(值= “附加参数”)不起作用。

尝试通过以下注记来使用地图:

@Resource
private Properties AdditionalParams;

并保持您的应用程序上下文.xml文件完好无损。


推荐