2 votes

Arguments des constructeurs dans les sources de câblage automatique

Quelle en est la cause exacte ?

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)

Ce dont j'ai besoin, c'est d'un auto-câblage de 3 choses : validateur, connexion ldap et connexion à la base de données.

Je l'appelle :

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

L'erreur semble être causée par un autre bean, si je change l'ordre de ces paramètres. Je n'ai pas de signature, donc je n'ai pas de UserDetails ou autre.

3voto

Sean Patrick Floyd Points 109428

La solution est probablement quelque chose comme ça :

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

Puisqu'il y a apparemment deux haricots de type KeyCardManager dans le contexte de votre application, vous devez indiquer au contexte lequel câbler.

Malheureusement, le @Qualifier ne fonctionne pas avec les noms de bean, vous devez soit annoter le bean réel avec une balise correspondante @Qualifier ou ajouter un <qualifier> à la définition XML du haricot.

Le site @Resource fonctionne avec les noms de haricots, mais ne supporte pas les paramètres des constructeurs (ce n'est pas la faute de Spring, c'est une erreur d'interprétation). JSR-250 annotation standard avec @Target({TYPE, FIELD, METHOD}) )

Référence :


Dépannage

Si vous ne savez pas pourquoi il y a deux beans du même type dans le contexte, naviguez tout d'abord vers l'interface du bean (je suppose que KeyCardManager est une interface, sinon, faites la même chose pour la classe de toute façon) et si vous utilisez Eclipse sélectionnez Navigate > Open Type Hierarchy . Si vous trouvez plus d'une classe concrète qui hérite de KeyCardManager (y compris KeyCardManager elle-même), alors c'est probablement là que se situe votre problème.

Si ce n'est pas le cas, vous avez probablement deux beans du même type dans votre contexte d'application. Cela peut se produire lorsque vous définissez un bean à la fois par le biais de XML et de balayage du classpath . C'est-à-dire que si vous avez cette ligne dans votre XML :

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

Assurez-vous de ne pas câbler manuellement des haricots depuis le org.example (sinon vous aurez des haricots doubles, ce qui peut conduire au problème que vous rencontrez).

1voto

Jigar Joshi Points 116533

org.springframework.beans.factory.NoSuchBeanDefinitionException : Aucun bean unique de type [fi.utu.keycard.business.KeyCardManager] n'est défini : on s'attendait à un seul bean correspondant mais on en a trouvé 2 : [dataBaseTarget, database].

Il semble que vous fassiez du câblage automatique par type de classe. Mais il y a plusieurs beans disponibles dans le contexte avec la même classe, à savoir dataBase & dataBaseTarget

parType

Permet à une propriété d'être autoprogrammée si il y a exactement un haricot du type type de propriété dans le conteneur. Si il y en a plus d'un, une est levée, et ceci indique que vous ne pouvez pas utiliser byType pour ce bean. S'il n'y a aucun bean correspondant, rien ne se passe ; la propriété n'est pas définie. Si c'est pas souhaitable, la définition de l'attribut dependency-check="objects" attribut spécifie qu'une erreur doit erreur dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X