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

0voto

SkyWalker Points 7044

Scénario :

Je travaille sur un projet Gradle multi-modules.

Les modules sont les suivants

- core, 
- service,
- geo,
- report,
- util and
- some other modules.

Nous avons donc avant tout préparé un volet[ locationRecommendHttpClientBuilder ] en géo module.

Code Java :

import org.springframework.stereotype.Component

@Component("locationRecommendHttpClientBuilder")
class LocationRecommendHttpClientBuilder extends PanaromaHttpClientBuilder {
    @Override
    PanaromaHttpClient buildFromConfiguration() {
        this.setURL(PanaromaConf.getInstance().getString("locationrecommend.url"))
        this.setMethod(PanaromaConf.getInstance().getString("locationrecommend.method"))
        this.setProxyHost(PanaromaConf.getInstance().getString("locationrecommend.proxy.host"))
        this.setProxyPort(PanaromaConf.getInstance().getInt("locationrecommend.proxy.port", 0))
        return super.build()
    }
}

application-context.xml

<bean id="locationRecommendHttpClient"
      class="au.co.google.panaroma.platform.logic.impl.PanaromaHttpClient"
      scope="singleton" factory-bean="locationRecommendHttpClientBuilder"
      factory-method="buildFromConfiguration" />

Il est alors décidé d'ajouter ce composant dans noyau module.

Un ingénieur a déjà codé pour géo et il a ensuite suivi le dernier module de noyau mais il a oublié de prendre la dernière géo module.

Ainsi, le composant[ locationRecommendHttpClientBuilder est double dans son projet et il obtenait l'erreur suivante.

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'LocationRecommendHttpClientBuilder' for bean class [au.co.google.app.locationrecommendation.builder.LocationRecommendHttpClientBuilder] conflicts with existing, non-compatible bean definition of same name and class [au.co.google.panaroma.platform.logic.impl.locationRecommendHttpClientBuilder]

Procédure de solution :

Après avoir retiré le composant de géo module, composant[ locationRecommendHttpClientBuilder n'est disponible qu'en noyau module. Il n'y a donc pas de situation conflictuelle. Le problème est résolu de cette manière.

0voto

Roopal Points 31

J'ai rencontré ce problème lorsque j'ai importé un projet double dans l'espace de travail. Il a créé un bocal différent d'une manière ou d'une autre. Nous pouvons donc supprimer les bocaux et les fichiers de classe et recréer le projet pour que les dépendances soient correctes.

0voto

pinkninja Points 65

En utilisant Eclipse, j'ai déplacé des classes dans de nouveaux paquets et j'ai obtenu cette erreur. Ce qui a fonctionné pour moi, c'est de faire : Projet > Nettoyer

et j'ai également nettoyé mon serveur TomCat en cliquant dessus avec le bouton droit de la souris et en sélectionnant propre

Merci à la réponse de Rock Lee de m'avoir aidé à comprendre :)

0voto

shail Points 3

Dans mon cas, le problème venait de pom.xml J'avais ajouté une dépendance dans mon application pom.xml pour deux paquets différents, qui reflétaient le même nom de classe.

Vérifiez votre pom.xml ou les annotations qui peuvent être le point d'injection possible pour la même classe.

-1voto

Rafraîchir le projet gradle sur Eclipse a résolu ce problème pour moi

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