【问题标题】:multiple data source in spring boot - jdbcTemplate is nullSpring Boot 中的多个数据源 - jdbcTemplate 为空
【发布时间】:2021-12-08 21:41:36
【问题描述】:

我在我的 Spring Boot 项目中使用多个数据源,

application.properties

#first DB
integration.datasource.jdbc-url=jdbc:sqlserver://localhost:port1/my_sample_schema1
integration.datasource.username=username
integration.datasource.password=password
integration.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
integration.jpa.database-platform=org.hibernate.dialect.SQLServer2012Dialect
integration.jpa.show-sql=true


#second DB
spring.datasource.jdbc-url=jdbc:sqlserver://localhost:port2/my_sample_schema2
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.platform=org.hibernate.dialect.SQLServer2012Dialect
spring.jpa.show-sql=true 

DBConfig.java

@Configuration
public class DBConfig {

    
      
    @Primary
    @Bean(name = "integrationDataSource")
    @ConfigurationProperties(prefix = "integration.datasource")
    public DataSource integrationDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "mainDataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource mainDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Autowired
    @Bean(name = "integrationJdbcTemplate")
    public JdbcTemplate integrationJdbcTemplate(@Qualifier("integrationDataSource") DataSource integrationDataSource) {
        return new JdbcTemplate(integrationDataSource);
    }

    @Bean(name ="mainJdbcTemplate")
    @Autowired
    public JdbcTemplate mainJdbcTemplate(@Qualifier("mainDataSource") DataSource mainDataSource) {
        return new JdbcTemplate(mainDataSource);
    }
}

SampleClass.java

@Slf4j
@Component
public class SampleClass{

    @Autowired
    private  JdbcTemplate mainJdbcTemplate;
    
    @Autowired
    @Qualifier("integrationJdbcTemplate")
    private static JdbcTemplate integrationTemplate;
    
    public static final String SELECT_QUERY = "select * from tableA";

    public List<SampleDto> getDBData(SampleDto fileData) {
        List<SampleDto> data = null;
        try {
            data = integrationTemplate.query(
                    SampleClass.SELECT_QUERY, new Object[] { param1, param2 },
                    new SampleDataMapper());
        } catch (DataAccessException e) {
            log.error(e.getMessage(), e);
        }
        return data;
    }

}

SampleClass.java 中将 integrationTemplate 设置为 null 。为什么会这样? mainJdbcTemplate 正在工作。但是 integrationTemplate 正在变为 null 并且无法执行查询。

【问题讨论】:

  • 尝试不使用@Qualifier 并使用与定义的@Bean 完全相同的名称(integrationJdbcTemplate)更新,您不能将static 字段与@Autowired 一起使用

标签: java spring-boot jdbc datasource


【解决方案1】:

问题是你有一个static 字段和@Autowired

@Autowired 字段是在 bean 构造之后,在调用任何配置方法之前立即注入的。阅读here 了解有关 Ioc 和 Bean 注入的更多信息。

删除static:

@Autowired
@Qualifier("integrationJdbcTemplate")
private JdbcTemplate integrationTemplate;

当然,你可以这样做,但不推荐

private static JdbcTemplate integrationTemplate;

@Autowired
public void setIntegrationJdbcTemplate(JdbcTemplate integrationTemplate){
    SampleClass.integrationTemplate = integrationTemplate;
}

按名称自动装配

如果您使用与用于 bean 初始化的名称完全相同的名称,则无需输入 @Qualifier,只需用作:

@Autowired
private JdbcTemplate integrationJdbcTemplate;

那是因为 Spring 知道要注入哪个 bean。如果您有更多相同类型的 bean,那么它将抛出 NoUniqueBeanDefinitionException,然后您使用 @Qualifier 定义它。

我还建议将您的字段标记为 final,以作为良好做法。

【讨论】:

  • 它有帮助..!!!静态是问题
猜你喜欢
  • 1970-01-01
  • 2019-11-14
  • 2017-09-12
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2023-03-20
  • 2013-07-25
  • 2017-01-08
相关资源
最近更新 更多