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 dieSpringBootServletInitializer
ohne die Implementierung der richtigen Methoden? und was haben Sie in Ihrer main-Methode ist auch nicht standard, nur verwendenSpringApplication.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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lief in ein ähnliches problem mit diesem heute und die folgenden spring cloud config Problem hat mir geholfen: Thema 1142.
Waren wir mit Spring Cloud Config, die ist nicht kompatibel mit Spring Boot 2.1.0 noch. Die Greenwich-release-train von Spring Cloud ist kompatibel mit Spring-Boot-2.1.0.
Ihre
@EnableCircuitBreaker
Anmerkung führt mich zu glauben, Sie könnte auch mit einer version von Spring Cloud ist nicht kompatibel mit der 2.1.0 release von Spring Boot.Für Spring Boot 2+ können Sie ausschließen auto-Konfiguration
Ich lief in ein ähnliches problem und es ist sehr allgemein gehalten (manchmal gibt es dupliziert annotation manchmal dupliziert Bohnen) Der beste Weg, um herauszufinden, wo das problem ist:
Offene Klasse DefaultListableBeanFactory
Sollte es code wie das:
Setzen Sie einen Haltepunkt in der Zeile mit dem throw new. Dann existingDefinition.Quelle.className verweist Konfiguration, die ist bereits registriert und hier ist das problem. Wenn Sie überprüfen die beanDefinition.Quelle.className vergleichen Sie beide Klassen und herauszufinden, wo sich doppelter code oder eine annotation ist, einfach löschen/lösen.
org.springframework.cloud:spring-cloud-Kontext:2.0.2.RELEASE
RefreshAutoConfiguration bewirkt, dass dieses Problem beim aktualisieren HikariDatasource in
eine mögliche Lösung ist