【发布时间】:2019-04-05 21:06:03
【问题描述】:
我已经升级到 spring boot 2.1 版本,启动应用程序时出现奇怪的异常。
无法注册在类路径资源 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class] 中定义的 BeanDefinition 中定义的 bean 'dataSource'。已在类路径资源 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class] 中定义了具有该名称的 bean,并且已禁用覆盖。
完整的错误信息是:
[osbwscAnnotationConfigServletWebServerApplicationContext] 上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.support.BeanDefinitionOverrideException:在类路径资源 [org/springframework/ boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]:无法注册bean定义[根bean:类[org.springframework.aop.scope.ScopedProxyFactoryBean];范围=;摘要=假;懒惰初始化=假;自动线模式=0;依赖检查=0;自动接线候选=真;主要=假;工厂BeanName=空;工厂方法名=空;初始化方法名=空;销毁方法名=空;在类路径资源 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] 中定义的 BeanDefinition 中定义 bean 'dataSource':已经存在 [Root bean: class [null];范围=刷新;摘要=假;懒惰初始化=假;自动线模式=3;依赖检查=0;自动接线候选=假;主要=假; factoryBeanName=org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari;工厂方法名=数据源;初始化方法名=空; destroyMethodName=(推断);在类路径资源 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] 中定义。
根据我们的政策,Beans 不能被覆盖,它被禁用:
spring.main.allow-bean-definition-overriding=false
我的应用程序代码中没有任何数据源配置。触发此错误的唯一选项是@EnableAutoConfiguration,在我的应用程序属性中,我已将数据源类型设置为:
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
启动应用程序被初始化为
@SpringBootApplication
@EnableAutoConfiguration
public class MyApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
new MyApplication()
.configure(new SpringApplicationBuilder(MyApplication.class))
.run(args);
}
}
还有一个配置类可以导入其他各种配置:
@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 {
...
}
有谁知道可能导致该问题的原因以及在哪里搜索?
在 Spring Boot 2.1(即 2.0.5)之前没有发生。
【问题讨论】:
-
你不需要设置数据源类型(hikari是默认的)和
spring.main.allow-bean-definition-overriding=false是默认的。您能否添加完整的堆栈跟踪并添加您的@SpringBootApplication注释类? -
@M.Deinum 我已经更新了包含完整错误详细信息和应用程序配置类的问题。
-
删除
@EnableAutoConfiguration已经被@SpringBootApplication隐含的。您的设置也有点奇怪,为什么要扩展SpringBootServletInitializer而不实施正确的方法?而且您在主要方法中所做的也不是标准的,只需使用SpringApplication.run(MyuApplication.class, args);而不是您现在拥有的。 -
@M.Deinum 应用所有这些更改后仍然是相同的错误。
-
由于某种原因,DataSource 自动配置似乎被处理了两次。正如@M.Deinum 建议的那样,这可能是由于组件扫描范围太广。如果不查看应用程序的所有相关部分,就无法确定。你能提供一个minimal, complete, and verifiable example吗?
标签: java spring spring-boot