Я имею то, что, кажется, простая проблема, как указано в заголовке. Вот вид класса, который я имею:
public class Foo {
@Autowired
public Foo(@Qualifier("bar") Set<String> bar) {
// ...
}
}
Который я пытаюсь выполнить со следующим пружинным контекстом:
<context:annotation-config />
<util:set id="bar">
<value>tata</value>
<value>titi</value>
<value>toto</value>
</util:set>
<bean id="foo" class="Foo" />
Этому не удается работать с:
Никакой боб соответствия типа [java.lang. Строка] найденный для зависимости [набор java.lang. Строка]: ожидаемый по крайней мере 1 боб, который квалифицирует как автопроводной кандидат на эту зависимость. Аннотации зависимости: {@org.springframework.beans.factory.annotation. Спецификатор (value=bar)}
Обратите внимание, что, если я добавляю другие параметры к своему конструктору, это хорошо работает. Если я использую инжекцию метода set, она хорошо работает. Я уверен, что пропускаю что-то очевидное... Вы знаете что?
Автоподключение коллекций невозможно с помощью аннотации @Autowired
. Автоподключаемая коллекция означает "предоставлять все бобы определенного типа". Используя аннотацию JSR-250 @Resource
, вы можете объявить, что хотите инжектировать ресурс по его имени, а не по его типу. Или вы вводите зависимость явно.
[...] бобы, которые сами определены как тип collection или map, не могут быть инжектированы через
@Autowired
, поскольку сопоставление типов к ним не применимо. Используйте@Resource
для таких бобов, ссылаясь на конкретный боб коллекции/карты по уникальному имени.
Подробнее см. в документации Spring.
Как утверждали другие, невозможно использовать @Autowired для строк и коллекций строк. Вы можете использовать @Value с spring EL здесь, если у вас есть Spring в версии 3:
public class Foo { @Autowired public Foo(@Value("#{bar}") Set<String> bar) { // ... } }
Я думаю потому, что Spring интерпретирует автоматическое связывание коллекции как «дай мне все компоненты типа String
», а не «дай мне bean-компонент, представляющий собой набор String
". Сообщение об ошибке поддерживает эту идею.
Я не думаю, что вы можете использовать для этого автоматическое подключение. Лучшее, что я могу предложить, если не считать его вручную в XML:
public class Foo {
private @Resource Set<String> bar;
}