DataSource-bean überschreiben im Frühjahr starten 2.1

Ich habe ein Upgrade auf spring boot-Version 2.1 und ich habe seltsame exception beim starten der Anwendung.

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.

Die vollständige Fehlermeldung lautet:

[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.

Bohnen müssen nicht überschrieben werden, nach unserer Politik, und es ist deaktiviert mit:

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

Habe ich keine data-source-Konfiguration in meiner Anwendung code. Die einzige option, die Trigger dieser Fehler ist @EnableAutoConfiguration und in meiner Anwendung, Eigenschaften, die ich als Typ der Datenquelle zu:

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

Die boot-Anwendung initialisiert wird mit

@SpringBootApplication
@EnableAutoConfiguration
public class MyApplication extends SpringBootServletInitializer {

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

Dort ist auch die configuration-Klasse, die Importe verschiedenen anderen Konfigurationen:

@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 {
    ...
}

Wer weiß, was könnte die Ursache, das Problem und wo soll man suchen?

Es nicht passiert vor Spring-Boot-2.1 (d.h. 2.0.5).

  • Sie brauchen nicht, um die datasource-Typ (hikari) ist die Standardeinstellung und spring.main.allow-bean-definition-overriding=false ist die Standardeinstellung. Könnte, fügen Sie den vollständigen stack-trace und fügen Sie Ihre @SpringBootApplication annotierten Klasse?
  • Ich habe aktualisiert, Frage mit vollständigen Angaben zu den Fehlern und der Anwendung configuration-Klassen.
  • Entfernen @EnableAutoConfiguration bereits impliziert @SpringBootApplication. Auch dein setup ist ein bisschen seltsam, warum verlängern die SpringBootServletInitializer ohne die Implementierung der richtigen Methoden? und was haben Sie in Ihrer main-Methode ist auch nicht standard, nur verwenden SpringApplication.run(MyuApplication.class, args); anstelle von dem, was Sie jetzt haben.
  • es ist immer noch der gleiche Fehler nach der Anwendung aller dieser änderungen.
  • Es gibt durchaus einige XML-Dateien geladen werden, ist das nicht zwingen eine andere importieren eines bereits vorhandenen configuration-Klasse? Zu breit-Komponente Scannen zum Beispiel?
  • Aus irgendeinem Grund scheint es, dass die DataSource-auto-Konfiguration wird doppelt verarbeitet. Wie @M. Deinum deutet darauf hin, dass sich aufgrund der Komponente Scannen zu breiten, unter anderem. Es ist unmöglich, sicher zu sagen, ohne zu sehen, alle relevanten Teile der Anwendung. Können Sie eine minimale, vollständige und überprüfbare Beispiel?

Schreibe einen Kommentar