错误信息:
The dependencies of some of the beans in the application context form a cycle:
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
┌─────┐
| dataSource defined in class path resource [com/gannalyo/saga/user/config/DataSourceConfig.class]
↑ ↓
| druidDataSource defined in class path resource [com/gannalyo/saga/user/config/DataSourceConfig.class]
↑ ↓
| dataSourceInitializer
└─────┘
解决方案:
在@SpringBootApplication注解中设置exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class,即不使用数据源的自动配置。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class UtxDSProxyApplication {
public static void main(String[] args) {
SpringApplication.run(UtxDSProxyApplication.class, args);
}
}
当然,一般情况可能不会出现此问题,我的情况比较特殊,使用了Druid连接池以及Fescar的数据源代理才导致此问题。
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.fescar.rm.datasource.DataSourceProxy;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
/**
* Configuration for DataSource with 'com.alibaba.fescar.rm.datasource.DataSourceProxy'.
*
* @author Gannalyo
*/
@Configuration
public class DataSourceConfig {
@Bean(name = "druidDataSource", destroyMethod = "close", initMethod = "init")
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
@Bean("dataSource")
@Primary
public DataSource dataSource(@Qualifier("druidDataSource") DruidDataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
}