Автопроводное соединение набора через конструктора с Spring

Я имею то, что, кажется, простая проблема, как указано в заголовке. Вот вид класса, который я имею:

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, она хорошо работает. Я уверен, что пропускаю что-то очевидное... Вы знаете что?

22
задан skaffman 29 July 2010 в 16:59
поделиться

3 ответа

Автоподключение коллекций невозможно с помощью аннотации @Autowired. Автоподключаемая коллекция означает "предоставлять все бобы определенного типа". Используя аннотацию JSR-250 @Resource, вы можете объявить, что хотите инжектировать ресурс по его имени, а не по его типу. Или вы вводите зависимость явно.

[...] бобы, которые сами определены как тип collection или map, не могут быть инжектированы через @Autowired, поскольку сопоставление типов к ним не применимо. Используйте @Resource для таких бобов, ссылаясь на конкретный боб коллекции/карты по уникальному имени.

Подробнее см. в документации Spring.

23
ответ дан 29 November 2019 в 05:13
поделиться

Как утверждали другие, невозможно использовать @Autowired для строк и коллекций строк. Вы можете использовать @Value с spring EL здесь, если у вас есть Spring в версии 3:

public class Foo {
    @Autowired
    public Foo(@Value("#{bar}") Set<String> bar) {
        // ...
    }
}
5
ответ дан 29 November 2019 в 05:13
поделиться

Я думаю потому, что Spring интерпретирует автоматическое связывание коллекции как «дай мне все компоненты типа String », а не «дай мне bean-компонент, представляющий собой набор String ". Сообщение об ошибке поддерживает эту идею.

Я не думаю, что вы можете использовать для этого автоматическое подключение. Лучшее, что я могу предложить, если не считать его вручную в XML:

public class Foo {  
   private @Resource Set<String> bar;
}
2
ответ дан 29 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: