我在构建此项目时遇到问题,我无法正确配置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?
答案 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>.sql
和schema-<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());
这应该解决问题的循环依赖性