Mar*_*iak 21 java spring spring-boot
我已升级到spring boot 2.1版本,启动应用程序时遇到奇怪的异常.
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.
Run Code Online (Sandbox Code Playgroud)
完整的错误消息是:
[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.
Run Code Online (Sandbox Code Playgroud)
不得根据我们的政策覆盖豆类,并且禁用豆类:
spring.main.allow-bean-definition-overriding=false
Run Code Online (Sandbox Code Playgroud)
我的应用程序代码中没有任何数据源配置.触发此错误的唯一选项是@EnableAutoConfiguration在我的应用程序属性中,我已将数据源类型设置为:
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
Run Code Online (Sandbox Code Playgroud)
启动应用程序初始化为
@SpringBootApplication
@EnableAutoConfiguration
public class MyApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
new MyApplication()
.configure(new SpringApplicationBuilder(MyApplication.class))
.run(args);
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个配置类可以导入各种其他配置:
@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 {
...
}
Run Code Online (Sandbox Code Playgroud)
有谁知道什么可能导致该问题以及在哪里搜索?
它没有发生在Spring Boot 2.1之前(即2.0.5).
我遇到了一个类似的问题,它非常通用(有时有重复的注释,有时是重复的 bean)。如果您复制了@EnableJpaRepository 之类的注释,则错误消息根本不会提及此注释。找出问题所在的最佳方法:
打开类 DefaultListableBeanFactory 应该有这样的代码:
BeanDefinition existingDefinition = (BeanDefinition)this.beanDefinitionMap.get(beanName);
if (existingDefinition != null) {
if (!this.isAllowBeanDefinitionOverriding()) {
throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
}
Run Code Online (Sandbox Code Playgroud)
将断点与 throw new 对齐。然后 existingDefinition.source.className 指向已经注册的配置,这就是问题所在。当您检查 beanDefinition.source.className 时,您将比较两个类并找到重复代码或注释的位置,只需删除/修复它们即可。
在 application.properties 中添加以下属性将解决问题。
spring.main.allow-bean-definition-overriding=true
此外,可能需要添加另一个属性来解决提到的另一个问题:https : //github.com/openzipkin/zipkin/issues/2043
management.metrics.web.server.auto-time-requests=false
| 归档时间: |
|
| 查看次数: |
24135 次 |
| 最近记录: |