一尘不染

SpringBoot和SpringJDBC多个数据源

spring-boot

我正在尝试在SpringBoot应用程序中使用两个数据源,但无法将第二个数据源自动装配。我尝试了很多事情,但这是我最近来的事情:

我的Yaml文件:

spring:
  first-datasource:
    url: MyURLString1
    username: User
    password: Password
    driver-class-name: oracle.jdbc.OracleDriver
  second-datasource:
    url: MyURLString2
    username: User
    password: Password
    driver-class-name: oracle.jdbc.OracleDriver

我的申请类别:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.first-datasource")
    public DataSource firstDataSource() {
        return DataSourceBuilder.create().build();
    }

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

最后是我的DAO:

@Repository
public class MyDao {
    private static final String FIRST_SELECT = "select * from SomeTableInDB1";
    private static final String SECOND_SELECT = "select * from AnotherTableInDB2";

    @Autowired
    private JdbcTemplate firstJdbcTemplate;
    @Autowired
    @Qualifier("secondDataSource")
    private JdbcTemplate secondJdbcTemplate;

    List<DB1Entity> getDB1Entity(Long id) {
        return firstJdbcTemplate.query(FIRST_SELECT, new Object[] {id}, new BeanPropertyRowMapper(DB1Entity.class));
    }

    List<DB2Entity> getDB2Entity(Long id) {
        return secondJdbcTemplate.query(SECOND_SELECT, new Object[] {id}, new BeanPropertyRowMapper(DB2Entity.class));
    }
}

这是我到目前为止最接近的。我说这是最接近的,因为如果我删除@Qualifier,那么我的两个dao方法都可以正常工作,假设SECOND_SELECT语句对我的DB1是有效的SQL。一旦为非主要datasouce输入@Qualifier,我就会收到自动装配错误,因为Spring期望使用Datasouce对象,而不是JdbcTemplate对象。这对我来说很奇怪,因为它可以与主要数据源一起使用。

这是我的错误:

无法自动连线栏位:私人org.springframework.jdbc.core.JdbcTemplate
org.my.classpath.secondJdbcTemplate;
嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为[org.springframework.jdbc.core.JdbcTemplate]的合格Bean作为依赖项:至少需要1个有资格作为此依赖项的自动装配候选的bean。依赖项注释:{@
org.springframework.beans.factory.annotation.Autowired(required = true),@
org.springframework.beans.factory.annotation.Qualifier(value =
secondDataSource)}


阅读 454

收藏
2020-05-30

共1个答案

一尘不染

您创建了类型的Bean DataSource ,但是尝试自动 装配 JdbcTemplate,这是不匹配的。您可能应该有这样的东西

private JdbcTemplate jdbcTemplate1;
private JdbcTemplate jdbcTemplate2;

@Autowired
@Qualifier("firstDataSource")
public void setDataSource(DataSource dataSource){
    this.jdbcTemplate1=new JdbcTemplate(dataSource);
}

@Autowired
@Qualifier("secondDataSource")
public void setDataSource(DataSource dataSource){
    this.jdbcTemplate2=new JdbcTemplate(dataSource);
}
2020-05-30