创建名称为“ dataSource”的bean时出错:当前正在创建请求的bean

时间:2018-10-11 06:48:26

标签: spring-boot

  

我在构建此项目时遇到问题,我无法正确配置dataSource bean。我最近更新了Config类。可能是由于Datasource引发了问题。

application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/xyz?createDatabaseIfNotExist=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver



server.port = 8081

Bean定义

@Bean

public DataSource dataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
    dataSource.setUrl(env.getProperty("spring.datasource.url"));
    dataSource.setUsername(env.getProperty("spring.datasource.username"));
    dataSource.setPassword(env.getProperty("spring.datasource.password"));
    return dataSource;
}

但是请遵循我无法解决的异常。

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'dataSource': Requested bean is currently in creation: Is there an unresolvable circular reference?

1 个答案:

答案 0 :(得分:1)

我认为您不需要提供此配置:

@Bean
public DataSource dataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
    dataSource.setUrl(env.getProperty("spring.datasource.url"));
    dataSource.setUsername(env.getProperty("spring.datasource.username"));
    dataSource.setPassword(env.getProperty("spring.datasource.password"));
    return dataSource;
}

Spring已经使用以spring开头的配置来创建DataSource的实例。请参阅文档的this section

编辑 没关系。您可以在配置客户端的类中注入DataSource实例。如果要初始化表,则可以创建两个文件:data-<dbName>.sqlschema-<dbName>.sql并将它们放在资源目录中。如果仍然要使用此设置,您可以做的最后一件事是重命名application.properties中的变量以不使用Spring's属性键。请使用this reference初始化数据库。

您面临的问题也可能与这两种方法都非常相关:

@Bean

public DataSource dataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
    dataSource.setUrl(env.getProperty("spring.datasource.url"));
    dataSource.setUsername(env.getProperty("spring.datasource.username"));
    dataSource.setPassword(env.getProperty("spring.datasource.password"));
    return dataSource;
}


@Bean
public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
    final DataSourceInitializer initializer = new DataSourceInitializer();
    initializer.setDataSource(dataSource);
    initializer.setDatabasePopulator(databasePopulator());
    return initializer;
}

我想是发生了什么事,您有一个名为dataSource的类的成员变量,您正在以某种方式(可能是通过@Autowired进行初始化),该变量正在dataSourceInitializer中使用方法。现在,当创建此bean时,它要求有一个dataSource的实例,但是该对象不可用,因为仍在初始化包含类。你能看看这个吗。可能要全班上课。

编辑2: 如预期的那样,该错误是由于您试图在仍创建DataSource时注入它而导致的。最简单的解决方案是删除此行:

@Autowired
private DataSource dataSource;

完成此操作后,将dataSourceInitializer的实现更改为将dataSource()使用为:

initializer.setDataSource(dataSource());

这应该解决问题的循环依赖性