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);
}
Это решение работает хорошо для меня