Spring can't autowire Map bean
I've defined a map in spring as such:
<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>
And then I'm autowiring this bean to a property defined as:
private @Autowired @Qualifier(value = "AdditionalParams") Map<String, String> additionalParams;
When doing this, the an exception get's thrown saying that:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'DutyCreator': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.util.Map DutyCreator.additionalParams; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [java.lang.String] found for dependency [map with value type java.lang.String]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=AdditionalParams)}
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [java.lang.String] found for dependency [map with value type java.lang.String]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=AdditionalParams)}
Any ideas?
Cheers.
Solution 1:
Starting with Spring 4.3, @Autowired
can inject lists and maps and the given code in the question would work:
That said, as of 4.3, collection/map and array types can be matched through Spring’s
@Autowired
type matching algorithm as well, as long as the element type information is preserved in@Bean
return type signatures or collection inheritance hierarchies.
But with a lower Spring version, you can't autowire a collection like that. However, you can do the following:
@Resource(name="AdditionalParams")
private Map<String, String> additionalParams;
or even:
@Value("#{AdditionalParams}")
private Map<String, String> additionalParams;
Check the spring docs, the tips section:
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
Solution 2:
Seems like your @Qualifier(value = "AdditionalParams") is not working.
Try using the map by following annotation :
@Resource
private Properties AdditionalParams;
and keeping your applicationContext.xml file intact.