web-dev-qa-db-fra.com

Bean DataSource prioritaire au démarrage du printemps 2.1

J'ai mis à niveau vers la version de printemps 2.1 de démarrage et j'ai une exception étrange 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.

Les beans ne doivent pas être remplacés conformément à notre politique et sont désactivés avec:

spring.main.allow-bean-definition-overriding=false

Je n'ai aucune configuration de source de données dans mon code d'application. La seule option qui déclenche cette erreur est @EnableAutoConfiguration et dans les propriétés de mon application, j'ai défini le type de source de données sur:

spring.datasource.type=com.zaxxer.hikari.HikariDataSource

L'application de démarrage est initialisée avec

@SpringBootApplication
@EnableAutoConfiguration
public class MyApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        new MyApplication()
            .configure(new SpringApplicationBuilder(MyApplication.class))
            .run(args);
    }
}

Il existe également une classe de configuration qui importe diverses 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 {
    ...
}

Est-ce que quelqu'un sait ce qui pourrait causer ce problème et où chercher?

Cela ne s’est pas produit avant Spring Boot 2.1 (c’est-à-dire 2.0.5).

12
Mariusz Miesiak

J'ai rencontré un problème similaire avec ce problème aujourd'hui et le problème de configuration des nuages ​​au printemps suivant m'a aidé: n ° 1142

Nous utilisions Spring Cloud Config, qui n'est pas encore compatible avec Spring Boot 2.1.0. La version de Greenwich de Greenwich sera compatible avec Spring Boot 2.1.0.

Votre annotation @EnableCircuitBreaker m'amène à penser que vous pourriez également utiliser une version de Spring Cloud non compatible avec la version 2.1.0 de Spring Boot.

17
Brad Fontaine

Pour Spring Boot 2+, vous pouvez exclure la configuration automatique.

@SpringBootApplication(exclude = ElasticsearchDataAutoConfiguration.class)
     public class YourApplication {
 ... }
0
Kamal A. SIddiqui