一尘不染

在Spring Boot 2.1中重写DataSource bean

spring-boot

我已升级到Spring Boot 2.1版本,启动应用程序时遇到了奇怪的异常。

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

完整的错误消息是:

[osbwscAnnotationConfigServletWebServerApplicationContext]上下文初始化期间遇到异常-
取消刷新尝试:org.springframework.beans.factory.support.BeanDefinitionOverrideException:无效的bean定义,在类路径资源[org
/ springframework / boot / autoconfigure / jdbc / DataSourceConfiguration $
Hikari.class]:无法注册bean定义[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;
在bean的“数据源”的类路径资源[org / springframework / boot / autoconfigure / jdbc /
DataSourceConfiguration $ Hikari.class]中定义的BeanDefinition中定义:已经存在[Root
bean:class [null]; 范围=刷新; 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]中。springframework.boot.autoconfigure.jdbc.DataSourceConfiguration
$ Hikari; factoryMethodName = dataSource; initMethodName = null;
destroyMethodName =(推断); 定义在类路径资源[org / springframework / boot /
autoconfigure / jdbc / DataSourceConfiguration $
Hikari.class]中。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)之前没有发生过。


阅读 848

收藏
2020-05-30

共1个答案

一尘不染

今天,我遇到了类似的问题,随后的spring云配置问题对我有所帮助: 问题1142

到目前为止,我们正在使用与Spring Boot 2.1.0不兼容的Spring Cloud Config。Spring
Cloud的格林威治发布系列将与Spring Boot 2.1.0兼容。

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

2020-05-30