Spring невозможно autowire Карта bean

Я определил карту в spring как таковой:

<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: Ошибка при создании bean с именем "DutyCreator": не удалось выполнить инъекцию зависимых от автозапуска; Вложенное исключение - org.springframework.beans.factory.BeanCreationException: Не удалось создать поле autwire: private java.util.Map DutyCreator.additionalParams; Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: не найдено соответствия bean типа [java.lang.String] для зависимости [map со значением типа java.lang.String]: ожидается как минимум 1 bean, который квалифицируется как кандидат autwire для этой зависимости. Аннотации зависимостей: {@org.springframework.beans.factory.annotation.Autowired(required = true), @org.springframework.beans.factory.annotation.Qualifier(value = AdditionalParams)}

Вызвано: org.springframework.beans.factory.NoSuchBeanDefinitionException: не найдено соответствия bean типа [java.lang.String] для зависимости [map со значением типа java.lang.String]: ожидается как минимум 1 bean, который квалифицируется как кандидат autwire для этой зависимости. Аннотации зависимостей: {@org.springframework.beans.factory.annotation.Autowired(required = true), @org.springframework.beans.factory.annotation.Qualifier(value = AdditionalParams)}

Любые идеи?

Приветствия.

Ответ 1

Начиная с Spring 4.3, @Autowired может вводить списки и карты, и данный код в вопросе будет работать:

Тем не менее, начиная с 4.3, типы коллекции/карты и массива могут быть сопоставлены с помощью алгоритма соответствия типов Spring s @Autowired, если информация о типе элемента сохраняется в @Bean сигнатурах типа возврата или иерархии наследования коллекций.

Но с более низкой версией Spring вы не можете автоустановить такую ​​коллекцию. Однако вы можете сделать следующее:

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

или даже:

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

Ознакомьтесь с spring документами в разделе советов:

beans, которые сами определяются как тип коллекции или карты, не могут вводиться через @Autowired, потому что соответствие типов не подходит применимых к ним. Используйте @Resource для такого beans

Ответ 2

Кажется, что ваш @Qualifier (value = "AdditionalParams" ) не работает.

Попробуйте использовать карту по следующей аннотации:

@Resource
private Properties AdditionalParams;

и сохранить файл applicationContext.xml без изменений.

Ответ 3

@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);
}

//внутри вашего вызова

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

Это решение работает хорошо для меня