J'ai essayé de mettre à niveau une application fonctionnelle de Spring Boot 2.0.6 vers 2.1.2. J'ai eu quelques problèmes avec les tests après ce changement, mais j'ai finalement contourné cela. Je peux réussir à créer l'application à partir de NetBeans ( mvn clean install ). Cependant, lorsque j'essaie de lancer à partir d'une ligne de commande en utilisant mvn spring-boot: run , voici ce que j'obtiens:
LE DÉMARRAGE DE L'APPLICATION ÉCHOUÉ
Description:
Le bean 'xxxRepository', défini en null, ne peut pas être inscrit. Un bean avec ce nom a déjà été défini en null et le remplacement est désactivé.
Action:
Envisagez de renommer l'un des beans ou d'activer le remplacement en définissant spring.main.allow-bean-definition-overriding = true
La partie intéressante est que chaque fois que j'essaye de l'exécuter, l'erreur se trouve sur un référentiel différent, mais toujours avec le même message.
Il semblerait que cela ait à voir avec cette modification :
Remplacement des haricots
Le remplacement de bean a été désactivé par défaut pour empêcher qu'un bean soit accidentellement remplacé. Si vous comptez sur la priorité, vous besoin de définir spring.main.allow-bean-definition-overriding sur true.
Étant donné que cela affecte apparemment tous mes dépôts, je suppose qu'il y a un problème de configuration quelque part. Je peux suivre l'action recommandée, mais cela n'a fait aucune différence . Le problème est que je ne sais pas quoi changer dans la configuration pour que cela fonctionne à nouveau. Je ne sais même pas quoi publier qui est pertinent à la question. Des idées sur la façon de résoudre ce problème?
3 Réponses :
J'ai déjà vu cette erreur et j'avais une classe à LA FOIS annotée avec @Component ou @Repository ou @Service ET également enregistrée en tant que @Bean dans une classe de configuration. Est-ce votre cas aussi par hasard?
Dans ma classe WebSecurityConfig , j'avais un Bean qui remplaçait UserDetailsService avec ma propre implémentation. J'ai renommé le bean pour m'assurer qu'il n'y avait pas de conflit de nom, mais cela n'a pas aidé. Je n'ai trouvé aucun cas comme vous l'avez mentionné, mais merci pour la suggestion.
la partie "définie en null" me dérange, pouvez-vous nous montrer du code pour voir comment tout est câblé?
Quel code serait le plus utile à voir? Je ne sais pas quoi publier.
Le problème est définitivement lié à l'enregistrement du même bean deux fois, le fait que Spring enregistre deux fois une classe annotée avec deux stéréotypes différents ressemble à un problème de Spring?
J'ai eu un problème similaire, mais c'était uniquement avec l'annotation @NotNull . Lorsque j'ai amélioré le ressort, il s'est arrêté de fonctionner. J'ai essayé beaucoup de choses que j'ai trouvées ici dans SO, mais la seule chose qui a fonctionné pour moi était d'éliminer la base de données et de relancer Spring. Je sais que ça craint, mais je n'ai pas trouvé d'autre solution.
Bonne chance!
Qu'entendez-vous par «éliminer la base de données»?
Si par "éliminer la base de données" vous faisiez référence au référentiel maven, alors je pense que c'est ce qui a fait l'affaire. Je ne sais pas exactement quel était le problème, mais il devait y avoir quelque chose de conflictuel quelque part qui causait un problème. Il fonctionne maintenant, cependant. Merci!
"Eliminer la base de données" n'est pas une solution à un problème de référentiel
Nous avons rencontré ce problème lors de la mise à niveau de Spring Boot 2.0.x vers 2.1.x.
Je pourrais "résoudre" ce problème en autorisant le remplacement de la définition du bean avec spring.main.allow-bean-definition-overriding: true , mais j'avais envie de cacher la cause racine.
En fait, le remplacement de la définition du bean sert à cacher une mauvaise configuration de notre côté.
Après avoir inspecté nos classes @Configuration , nous avons analysé deux fois les packages contenant nos référentiels , en utilisant @ComponentScan et @EnableJpaRepository code> sur les mêmes packages de différentes classes: une fois avec des filtres @ ComponentScan.Filter , une fois sans.
La suppression de l'analyse du deuxième composant a résolu le problème.
Après avoir effacé mon référentiel maven, le programme fonctionnait, donc quelque chose de drôle s'était passé là-bas. J'ai découvert plus tard que j'avais toujours le paramètre allow-bean-definition-overriding sur true, ce qui permettait maintenant à mon programme de fonctionner. La suppression de cela a provoqué une erreur. Grâce à votre réponse, j'ai trouvé que j'avais @EnableJpaRepository placé à deux endroits. En supprimer un m'a permis de supprimer le remplacement de définition de bean et d'avoir toujours une application fonctionnelle. Merci!
Est-ce que quelqu'un sait si cette propriété de marquage du bean-overriding true sera là pendant longtemps à l'avenir OU serait-elle obsolète et supprimée plus tard dans un proche avenir?
Si vous revenez à Spring Boot 2.0.6, vous devriez voir des messages de journal au niveau des informations vous informant des beans qui sont remplacés et, espérons-le, expliquant pourquoi cela se produit.
@AndyWilkinson J'ai fait une recherche sur les logs, et il n'y avait rien au niveau INFO concernant les haricots remplacés. J'ai ensuite recherché "overrid" et j'ai trouvé
2019-02-05 14: 55: 27,765 localhost-startStop-1 DEBUG spi.ServiceBinding - Remplacement de la liaison de service existante [org.hibernate.secure.spi.JaccService], ce qui ne semble pas être quelque chose que je contrôle. J'ai ensuite fait une recherche sur "haricot", mais cela n'a rien produit de prometteur. Y a-t-il d'autres idées sur quoi rechercher, ou est-ce une bonne indication que rien n'est réellement annulé?J'ai un problème similaire actuellement, mais il ne se produit que lorsque j'ajoute une propriété spring comme argument de programme dans mon IDE, aucune idée de comment le résoudre