Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring can't autowire Map bean

Tags:

java

spring

map

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.

like image 289
Nick Avatar asked Dec 17 '12 11:12

Nick


People also ask

Why Autowired is not working?

When @Autowired doesn't work. There are several reasons @Autowired might not work. When a new instance is created not by Spring but by for example manually calling a constructor, the instance of the class will not be registered in the Spring context and thus not available for dependency injection.

How do you inject a map in Spring boot?

How to Inject a Map from a YAML File. Spring Boot has taken data externalization to the next level by providing a handy annotation called @ConfigurationProperties. This annotation is introduced to easily inject external properties from configuration files directly into Java objects.

What is @resource annotation in Spring?

The @Resource annotation in spring performs the autowiring functionality. This annotation follows the autowire=byName semantics in the XML based configuration i.e. it takes the name attribute for the injection.


Video Answer


2 Answers

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.

like image 43
Amber Avatar answered Sep 21 '22 17:09

Amber


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

like image 81
garst Avatar answered Sep 20 '22 17:09

garst