我刚刚将我的应用程序从Spring Boot 1.5.9升级到了2.1.3。我们有2个数据库,一个是不分片的,另一个是分片的。尝试启动应用程序时,出现以下错误:
┌─────┐
| shardedDataSource defined in class path resource [com/config/ShardedDataSourceConfig.class]
↑ ↓
| globalNamedParameterJdbcTemplate defined in class path resource [com/config/GlobalDataSourceConfig.class]
↑ ↓
| globalJdbcTemplate defined in class path resource [com/config/GlobalDataSourceConfig.class]
↑ ↓
| global defined in class path resource [com/config/GlobalDataSourceConfig.class]
↑ ↓
| org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker
└─────┘
在GlobalDataSourceConfig中,我具有以下Bean
@Bean(name = "global")
public DataSource globalDataSource() {
return new HikariDataSource(this);
}
@Bean(name = "globalJdbcTemplate")
public JdbcTemplate globalJdbcTemplate() {
return new JdbcTemplate(globalDataSource());
}
@Bean(name="globalNamedParameterJdbcTemplate")
public NamedParameterJdbcTemplate globalNamedParameterJdbcTemplate() {
return new NamedParameterJdbcTemplate(globalJdbcTemplate());
}
对于ShardedDataSourceConfig类中的shardedDataSource我有
@Primary @Bean @Profile("!test")
public DataSource shardedDataSource(@Qualifier("globalNamedParameterJdbcTemplate") NamedParameterJdbcTemplate jdbcTemplate) {
任何人都可以告诉我为什么会这样吗?
在升级之前,这没有发生。
我发现了类似的问题,但该解决方案不适用于SpringBoot 2
https://github.com/spring-projects/spring-boot/issues/9394
最佳答案
我通过删除shardedDataSource上的@Primary批注解决了我的问题。由于限定符用于globalNamedParameterJdbcTemplate,因此它将自动正确地进行Bean的初始化。