我正在尝试在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)}
您创建了类型的Bean DataSource ,但是尝试自动 装配 JdbcTemplate,这是不匹配的。您可能应该有这样的东西
DataSource
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); }