Source de données de haricot de remplacement dans le printemps de démarrage 2.1
J'ai mis à jour pour le printemps de démarrage version 2.1 et j'ai l'étrange exception lors du démarrage de l'application.
The bean 'dataSource', defined in BeanDefinition defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class], could not be registered. A bean with that name has already been defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class] and overriding is disabled.
Le message d'erreur complet est:
[o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'dataSource' defined in BeanDefinition defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Cannot register bean definition [Root bean: class [org.springframework.aop.scope.ScopedProxyFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in BeanDefinition defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] for bean 'dataSource': There is already [Root bean: class [null]; scope=refresh; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=false; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] bound.
Haricots doivent pas être modifiée conformément à notre politique, et c'est désactivée avec:
spring.main.allow-bean-definition-overriding=false
Je n'ai pas toutes les données de configuration de la source dans mon code de l'application. La seule option qui déclenche cette erreur est @EnableAutoConfiguration
et dans mon propriétés de l'application, j'ai défini le type de source de données:
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
L'application de démarrage est initialisé avec
@SpringBootApplication
@EnableAutoConfiguration
public class MyApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
new MyApplication()
.configure(new SpringApplicationBuilder(MyApplication.class))
.run(args);
}
}
Il y a aussi de la configuration de la classe que les importations de divers autres configurations:
@Configuration
@ImportResource(locations = {
"classpath*:conf/spring/*.xml",
"classpath*:conf/spring/core/*.xml",
"classpath*:conf/spring/plugin/**/*.xml"
})
@EnableAsync
@EnableRetry
@EnableCaching
@EnableBatchProcessing
@EnableCircuitBreaker
public class AppConfig {
...
}
Personne ne sait ce qui pourrait causer ce problème et où chercher?
Il n'a pas eu lieu avant le Printemps de Démarrage 2.1 (c'est à dire 2.0.5).
- Vous n'avez pas besoin de définir le type de source de données (hikari est la valeur par défaut) et
spring.main.allow-bean-definition-overriding=false
est la valeur par défaut. Pourriez-vous ajouter la totalité de la trace de pile et ajouter votre@SpringBootApplication
annoté de la classe? - J'ai mis à jour la question avec plein de détails de l'erreur et de l'application de configuration des classes.
- Supprimer
@EnableAutoConfiguration
qui est déjà implicite par@SpringBootApplication
. Aussi votre configuration est un peu étrange, pourquoi prolonger laSpringBootServletInitializer
sans la mise en œuvre de la bonne méthode? et ce que vous faites dans votre méthode principale n'est pas la norme suffit d'utiliserSpringApplication.run(MyuApplication.class, args);
au lieu de ce que vous avez maintenant. - c'est toujours la même erreur après l'application de tous ces changements.
- Il y a bien des fichiers XML en cours de chargement n'est pas que le fait de forcer une autre importation d'une configuration existante de la classe? Trop large composante de la numérisation, par exemple?
- Pour une raison quelconque, il semble que la source de données d'auto-configuration est en cours de traitement deux fois. Comme @M. Deinum suggère, qui pourrait être due à un composant de balayage étant trop large entre autres choses. Il est impossible de dire sans voir toutes les pièces de votre application. Pouvez-vous fournir une un minimum, complètes et vérifiables exemple?
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré un problème similaire avec ce aujourd'hui et le printemps suivant cloud config question qui m'a aidé: Question 1142.
Nous avons été à l'aide de Printemps Cloud Config qui n'est pas compatible avec Spring Boot 2.1.0 encore. Le méridien de Greenwich libération train de Printemps Nuage sera compatible avec Spring Boot 2.1.0.
Votre
@EnableCircuitBreaker
annotation m'amène à croire que vous pouvez également utiliser une version de Printemps Nuage qui n'est pas compatible avec la version 2.1.0 de Printemps de Démarrage.Pour le Printemps Boot 2+ vous pouvez exclure de l'auto-configuration
J'ai rencontré un problème similaire et il est très générique (parfois il y a dupliqué annotation parfois dupliquées haricots) La meilleure façon de trouver où est le problème:
Classe ouverte DefaultListableBeanFactory
Il devrait y avoir un code comme ceci:
Mettre un point d'arrêt dans la ligne de lancer de nouvelles. Puis existingDefinition.source.className pointe de configuration qui est déjà enregistré, et là est le problème. Lorsque vous vérifiez l'beanDefinition.source.className vous permettra de comparer les deux classes et de trouver l'endroit où le code dupliqué ou de l'annotation est, il suffit de supprimer/corriger.
org.springframework.cloud:printemps-cloud-contexte:2.0.2.COMMUNIQUÉ de
RefreshAutoConfiguration l'origine de ce problème lors de l'actualisation de HikariDatasource dans
un correctif est