webentwicklung-frage-antwort-db.com.de

DataSource-Bean, die im Spring Boot außer Kraft gesetzt wird 2.1

Ich habe ein Upgrade auf Spring Boot 2.1 veröffentlicht und habe beim Starten der Anwendung eine seltsame Ausnahme.

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 dürfen nicht gemäß unseren Richtlinien überschrieben werden und es ist deaktiviert mit:

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

Ich habe keine Datenquellenkonfiguration in meinem Anwendungscode. Die einzige Option, die diesen Fehler auslöst, ist @EnableAutoConfiguration. In meinen Anwendungseigenschaften habe ich den Datenquellentyp folgendermaßen festgelegt:

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

Die Boot-Anwendung wird mit initialisiert

@SpringBootApplication
@EnableAutoConfiguration
public class MyApplication extends SpringBootServletInitializer {

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

Es gibt auch eine Konfigurationsklasse, die verschiedene andere Konfigurationen importiert:

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

Weiß jemand, was das Problem verursachen könnte und wo gesucht werden muss?

Es ist nicht vor Spring Boot 2.1 (d. H. 2.0.5) passiert.

12
Mariusz Miesiak

Ich bin heute mit einem ähnlichen Problem konfrontiert und das folgende Spring-Cloud-Konfigurationsproblem half mir: Ausgabe 1142

Wir haben Spring Cloud Config verwendet, das noch nicht mit Spring Boot 2.1.0 kompatibel ist. Der Greenwich-Release-Zug von Spring Cloud wird mit Spring Boot 2.1.0 kompatibel sein.

Ihre @EnableCircuitBreaker-Anmerkung lässt vermuten, dass Sie möglicherweise auch eine Spring Cloud-Version verwenden, die nicht mit der Spring Boot-Version 2.1.0 kompatibel ist.

17
Brad Fontaine

Ich bin auf ein ähnliches Problem gestoßen und es ist sehr allgemein (manchmal gibt es doppelte Annotationen, manchmal doppelte Beans). Der beste Weg, um herauszufinden, wo das Problem liegt:

Offene Klasse DefaultListableBeanFactory Es sollte folgenden Code geben:

BeanDefinition existingDefinition = (BeanDefinition)this.beanDefinitionMap.get(beanName);
        if (existingDefinition != null) {
            if (!this.isAllowBeanDefinitionOverriding()) {
                throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
            }

Setzen Sie einen Haltepunkt in eine Linie mit throw new. Dann zeigt existingDefinition.source.className auf die Konfiguration, die bereits registriert ist, und hier ist das Problem. Wenn Sie den beanDefinition.source.className überprüfen, vergleichen Sie beide Klassen und finden heraus, wo sich doppelter Code oder doppelte Anmerkungen befinden. Löschen/korrigieren Sie sie einfach.

0
Pulkownik

Bei Spring Boot 2+ können Sie die automatische Konfiguration ausschließen

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

Durch Hinzufügen der folgenden Eigenschaft in application.properties wird das Problem behoben.

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

Ferner muss möglicherweise eine andere Eigenschaft hinzugefügt werden, um ein anderes erwähntes Problem zu beheben: https://github.com/openzipkin/zipkin/issues/204

management.metrics.web.server.auto-time-orders = false

0
Rahul