Автопроводка коллекции через конструктор с помощью Spring - PullRequest
21 голосов
/ 29 июля 2010

У меня есть то, что кажется простой проблемой, как указано в заголовке. Вот такой урок у меня есть:

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.String] найден для зависимость [коллекция java.lang.String]: ожидается как минимум 1 боб, который квалифицируется как autowire кандидат на эту зависимость. Аннотации зависимостей: {@ Org.springframework.beans.factory.annotation.Qualifier (значение = бар)} * +1010 *

Обратите внимание, что если я добавлю другие параметры в конструктор, он будет работать нормально. Если я использую сеттер для инъекций, он работает нормально. Я уверен, что упускаю что-то очевидное ... знаете что?

Ответы [ 4 ]

22 голосов
/ 30 июля 2010

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

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

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

5 голосов
/ 30 июля 2010

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

public class Foo {
    @Autowired
    public Foo(@Value("#{bar}") Set<String> bar) {
        // ...
    }
}
2 голосов
/ 15 апреля 2016

У меня была такая же проблема, и я был вдохновлен ответом @ rembisz . Этот ответ не работал в моей версии Spring (4.1.3). Когда я проверил документацию SpEL по ссылкам на bean-компоненты , я обнаружил другой синтаксис SpEL для выражения ссылок на bean-компоненты в значениях с автопроводкой, которые мне помогли - @beanname. Таким образом, следующий код работал для меня:

public class Foo {
    @Autowired
    public Foo(@Value("#{@bar}") Set<String> bar) {
        // ...
    }
}
2 голосов
/ 29 июля 2010

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

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

public class Foo {  
   private @Resource Set<String> bar;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...