Spring can't autowire Map bean

JavaSpringMap

Java Problem Overview


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.

Java Solutions


Solution 1 - Java

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 - Java

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.

Solution 3 - Java

@Autowired ApplicationContext ctx;
private  <T> T getBean(String qualifier, Class<T> returnType){
    //use this for loop to print all bean from ctx. so you wont miss the typo.
    /*for(String s:ctx.getBeanDefinitionNames())
        log.info(s);*/
    return ctx.getBean(qualifier, returnType);
}

// inside your call

 if(providerList == null){
       providerList = ctx.getBean("providerList", Map.class);
 }

This Solution works good to me

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNickView Question on Stackoverflow
Solution 1 - JavagarstView Answer on Stackoverflow
Solution 2 - JavaAmberView Answer on Stackoverflow
Solution 3 - JavaRamkumar PillaiView Answer on Stackoverflow