Spring无法自动装配Map bean

Nic*_*ick 57 java spring map

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

<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>
Run Code Online (Sandbox Code Playgroud)

然后我将这个bean自动装配到一个定义为:

private @Autowired @Qualifier(value = "AdditionalParams") Map<String, String> additionalParams;
Run Code Online (Sandbox Code Playgroud)

执行此操作时,会抛出一个异常,说:

引起:org.springframework.beans.factory.BeanCreationException:创建名为'DutyCreator'的bean时出错:注入自动连接的依赖项失败; 嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private java.util.Map DutyCreator.additionalParams; 嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:[java.lang.String中]找到的依赖性[地图值java.lang.String类型]无类型的匹配豆:预期至少1豆,其有资格作为候选自动装配对于这种依赖.依赖注释:{@ 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为依赖[map with value type java.lang.String]:期望至少有一个bean有资格作为autowire候选者对于这种依赖.依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Qualifier(value = AdditionalParams)}

有任何想法吗?

干杯.

gar*_*rst 117

从Spring 4.3开始,@Autowired 可以注入列表和映射,问题中的给定代码可以工作:

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

但是使用较低的Spring版本,您无法自动装配这样的集合.但是,您可以执行以下操作:

@Resource(name="AdditionalParams")
private Map<String, String> additionalParams;
Run Code Online (Sandbox Code Playgroud)

甚至:

@Value("#{AdditionalParams}")
private Map<String, String> additionalParams;
Run Code Online (Sandbox Code Playgroud)

查看spring文档,提示部分:

自身定义为集合或地图类型的bean无法通过@Autowired注入,因为类型匹配不适用于它们.对这样的bean使用@Resource

  • 哇,我已经在这个问题上花了几个小时了。为什么Spring只使用autowire而不是Resource?这种方式只会让 Spring 用起来很烦人。 (2认同)