我刚刚将我的应用程序从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的初始化。

10-06 09:25