83 votes

Le nom du bean spécifié par l'annotation est en conflit avec un bean existant, non compatible.

J'ai un problème avec certaines définitions de Spring bean. J'ai quelques fichiers xml de contexte qui sont chargés par ma méthode main(), et les deux contiennent presque exclusivement une balise. Lorsque ma méthode principale démarre, j'obtiens cette erreur de Spring :

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'converterDAO' for bean class [my.package.InMemoryConverterDaoImpl] conflicts with existing, non-compatible bean definition of same name and class [my.other.package.StaticConverterDAOImpl]

Les deux classes DAO sont annotées de cette manière :

@Repository("converterDAO")
public class StaticConverterDAOImpl implements ConverterDAO {
...
}

Le dao en mémoire possède également l'annotation @Repository("converterDAO"). Le dao est référencé dans d'autres classes comme celle-ci :

...
private @Autowired @Qualifier("converterDAO") ConverterDAO converterDAO;
...

Je veux qu'un DAO remplace la définition de l'autre, ce qui, d'après ce que j'ai toujours compris, est l'une des principales raisons d'utiliser un cadre DI en premier lieu. Je fais cela avec des définitions xml depuis des années et je n'ai jamais eu de problèmes. Mais ce n'est pas le cas avec les scans de composants et les définitions de beans annotées ? Et que veut dire Spring lorsqu'il affirme qu'ils ne sont pas "compatibles" ? Ils implémentent la même interface, et ils sont autowired dans les champs qui sont de ce type d'interface. Pourquoi diable ne sont-ils pas compatibles ?

Quelqu'un peut-il me fournir un moyen pour qu'un haricot annoté et balayé par des composants puisse en remplacer un autre ?

-Mike

8voto

Victor Karangwa Points 411

J'ai eu le même problème. Je l'ai résolu en suivant les étapes suivantes (Editor : IntelliJ ):

  1. Vue -> Fenêtres d'outils -> Projet Maven. Ouvre vos projets dans une sous-fenêtre.
  2. Cliquez sur la flèche à côté de votre projet.
  3. Cliquez sur le cycle de vie.
  4. Cliquez sur nettoyer.

3voto

NShani Points 43

J'ai également eu un problème similaire. J'ai reconstruit le projet et le problème a été résolu.

La raison en est qu'il existe déjà des séquences définies pour les noms de haricots spécifiés par l'annotation, dans un fichier. Lorsque nous modifions ce nom de bean et que nous essayons d'exécuter l'application, Spring ne peut pas identifier la séquence à choisir. C'est pourquoi il affiche cette erreur.

Dans mon cas, j'ai supprimé la classe de haricots précédente du projet et j'ai ajouté le même nom de haricot à une nouvelle classe de haricots. Spring a donc la définition précédente de la classe de haricot supprimée dans un fichier et elle entre en conflit avec la classe nouvellement ajoutée lors de la compilation. Donc si vous faites un "build clean", les définitions précédentes des classes de beans seront supprimées et la compilation réussira.

2voto

João Rodrigues Points 381

Si aucune des autres réponses ne résout votre problème et qu'il a commencé à se produire après un changement de configuration direct ou indirect (via git pull / merge / rebase) et que votre projet est un projet Maven :

mvn clean

J'espère que cela résoudra votre problème. Ou quelqu'un d'autre

2voto

J'ai eu le même problème sur IntelliJ après avoir déplacé un fichier existant dans un nouveau paquet, résolu le nettoyage de caché, en essayant de l'exécuter avec maven, j'ai obtenu cette erreur. J'ai réussi à le résoudre avec :

cache:clean

1voto

abhinav kumar Points 651

Explication travail interne sur cette erreur

Vous obtenez cette erreur parce qu'après l'instanciation, le conteneur essaie d'assigner le même objet aux deux classes car le nom de la classe est le même indépendamment des différents paquets ....... C'est pourquoi l'erreur indique une définition de haricot non compatible avec le même nom.

En fait, le fonctionnement interne est le suivant : >>>>.

pkg test1 ; . @RestController classe Test{}

pkg test2 ; . @RestController classe Test{}

Le premier conteneur obtiendra la classe Test et @RestController lui indique de s'instancier comme test = new Test() ; et il ne s'instanciera pas deux fois. Après l'instanciation, le conteneur fournira une variable de référence test (identique au nom de la classe) aux deux classes et pendant qu'il fournit la référence test. La deuxième classe reçoit une définition de bean non compatible du même nom

Solution->>>>

Attribuer un nom de référence aux deux contrôleurs de repos afin que le conteneur ne soit pas instancié avec le nom par défaut et instancié séparément pour les deux classes indépendamment. du même nom

Par exemple

pkg test1 ; . @RestController("test1") classe Test{}

pkg test2 ; . @RestController("test2") classe Test{}

Note :La même chose fonctionnera avec @Controller,@Service,@Repository etc.

Note Si vous créez une variable de référence au niveau de la classe, vous pouvez également l'annoter avec @Qualifier("nom de référence spécifique"), par exemple @Autowired @Qualifier("test1") Test test ;

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