Аргументы конструктора в источниках автопроводки - PullRequest
2 голосов
/ 04 февраля 2011

Что именно вызывает это?

org.springframework.beans.factory.NoSuchBeanDefinitionException: \
No unique bean of type [fi.utu.keycard.business.KeyCardManager] \
is defined: expected single matching bean but found 2: \
[dataBaseTarget, database]

// etc. (rest of Stack Trace is irrelevant)

Что мне нужно, так это автоматическое подключение 3 вещей: валидатор, подключение ldap и подключение к базе данных.

Я называю это:

@Controller
Controller(KeyCardManager database,
           LdapPersonDao personManager,
           GiveFormValidator validator)

Ошибка, по-видимому, вызвана другим компонентом, если я изменю порядок этих параметров. У меня нет входа, поэтому у меня нет UserDetails или около того.

Ответы [ 2 ]

3 голосов
/ 04 февраля 2011

Исправление, вероятно, выглядит примерно так:

public Controller(
    @Qualifier("beanQualifier") KeyCardManager database,
    LdapPersonDao personManager,
    GiveFormValidator validator
)

Поскольку в контексте приложения, по-видимому, есть два компонента типа KeyCardManager, необходимо указать контексту, какой из них подключить.

К сожалению, механизм @Qualifier не работает с именами bean-компонентов, вы должны либо аннотировать фактический bean-компонент соответствующим @Qualifier, либо добавить элемент <qualifier> в определение bean-компонента XML.

@Resource аннотация работает с именами компонентов, но не поддерживает параметры конструктора (это не ошибка Spring, это стандартная аннотация JSR-250 с @Target({TYPE, FIELD, METHOD}))

Справка:


Устранение неполадок

Если вы не знаете, почему в контексте присутствуют два bean-компонента одного типа, прежде всего перейдите к интерфейсу bean (я предполагаю, что KeyCardManager - это интерфейс, еслинет, сделать то же самое для класав любом случае) и если вы используете Eclipse, выберите Navigate > Open Type Hierarchy.Если вы обнаружите более одного конкретного класса, который наследуется от KeyCardManager (включая сам KeyCardManager), то, вероятно, ваша проблема.

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

<context:component-scan base-package="org.example"/>

Убедитесь, что вы не проводите вручную какие-либо bean-компоненты из пакета org.example (или у вас будут двойные bean-компоненты, которые могут привести к проблеме, которую выесть).

1 голос
/ 04 февраля 2011

org.springframework.beans.factory.NoSuchBeanDefinitionException: не определен уникальный bean-компонент типа [fi.utu.keycard.business.KeyCardManager]: ожидается один соответствующий бин, но найдено 2: [dataBaseTarget, database]

Кажется, вы проводите по типу класса.но есть несколько бинов, доступных в контексте с одним и тем же классом.dataBase & dataBaseTarget

byType

Позволяет автоматически связывать свойство, если в контейнере ровно один бин типа свойства,Если их больше одного, возникает фатальное исключение, и это указывает на то, что вы не можете использовать автоматическую разводку по типу для этого компонента.Если нет соответствующих бинов, ничего не происходит;свойство не установлено.Если это нежелательно, установка значения атрибута dependency-check = "objects" указывает, что в этом случае должна возникать ошибка.

...