数据源 Bean 在 Spring boot 2.1 中重写

2022-09-01 10:45:33

我已经升级到spring boot 2.1版本,并且在启动应用程序时遇到了奇怪的异常。

在类路径资源 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class] 中定义的 Bean'dataSource' 无法注册。具有该名称的Bean已经在类路径资源[org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]中定义,并且覆盖被禁用。

完整的错误消息是:

[o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext] 在上下文初始化期间遇到的异常 - 取消刷新尝试:org.springframework.beans.factory.support.BeanDefinitionOverrideException:在类路径资源中定义的Bean定义中定义的Bean定义无效的Bean定义[org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]:无法注册Bean定义[根bean:类[org.springframework.aop.scope.ScopedProxyFactoryBean];范围 =;抽象=假;lazyInit=false;自动线模式 = 0;依赖性检查= 0;自动线候选 = 真;主要 = 假;factoryBeanName=null;工厂方法名称 =空;initMethodName=null;destroyMethodName=null;在 BeanDefinition 中定义的类路径资源 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] for bean 'dataSource': There 已经有 [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=(推断);在类路径资源 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] 绑定中定义。

根据我们的政策,不得覆盖 Bean,并且会禁用:

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)之前没有发生过。


答案 1

我今天遇到了类似的问题,接下来的春季云配置问题对我有所帮助:问题1142

我们使用的是Spring Cloud Config,目前还不兼容Spring Boot 2.1.0。Spring Cloud的Greenwich发布版本将与Spring Boot 2.1.0兼容。

您的注释使我相信您可能也在使用与Spring Boot的2.1.0版本不兼容的Spring Cloud版本。@EnableCircuitBreaker


答案 2

在 application.properties 中添加以下属性将解决此问题。

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

此外,可能必须添加另一个属性来解决提到的另一个问题:https://github.com/openzipkin/zipkin/issues/2043

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


推荐