2010-07-29 3 views
20

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

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" /> 

Это не удается запустить с:

Нет соответствие боба type [java.lang.String] найдено для dependency [коллекция java.lang.String]: ожидается как минимум 1 bean, который квалифицируется как autowire Кандидат на эту зависимость. Зависимость от аннотаций: {@ org.springframework.beans.factory.annotation.Qualifier (значение = бар)}

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

ответ

22

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

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

См. the Spring documentation для получения более подробной информации.

2

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

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

public class Foo { 
    private @Resource Set<String> bar; 
} 
5

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

 
public class Foo { 
    @Autowired 
    public Foo(@Value("#{bar}") Set<String> bar) { 
     // ... 
    } 
} 
2

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

public class Foo { 
    @Autowired 
    public Foo(@Value("#{@bar}") Set<String> bar) { 
     // ... 
    } 
} 
Смежные вопросы