java - 使用 JdbcTemplate 访问多个数据源会导致错误

标签 java spring-boot jdbctemplate

我有两个项目,一个包含 DAO 类和模型,另一个包含 Rest Controller

项目 A:DAO 类 + 模型

项目 B:休息 Controller

<小时/>

项目A

应用程序属性:

spring.abcDatasource.url=
spring.abcDatasource.username=
spring.abcDatasource.password=
spring.abcDatasource.driver-class-name=oracle.jdbc.driver.OracleDriver


spring.xyzDatasource.url=
spring.xyzDatasource.username=
spring.xyzDatasource.password=
spring.xyzDatasource.driver-class-name=oracle.jdbc.driver.OracleDriver


spring.datasource.initialize=false

DBConfiguration.java

@Configuration
public class DBConfiguration {

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

    @Bean(name = "abcJdbc")
    public JdbcTemplate abcJdbcTemplate(@Qualifier("abcDS") DataSource abcDS) {
        return new JdbcTemplate(abcDS);
    }

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

    @Bean(name = "xyzJdbc")
    public JdbcTemplate ebsJdbcTemplate(@Qualifier("xyzDS") DataSource xyzDatasource) {
        return new JdbcTemplate(xyzDatasource);
    }


}

AlphaDAO.Java

@Repository
public class AlphaDAO{

    @Autowired
    @Qualifier("abcJdbc")
    private JdbcTemplate abcJdbc;

    @Autowired
    @Qualifier("xyzJdbc")
    private JdbcTemplate xyzJdbc;

    SqlParameterSource namedParameters;



    public Collection<Alpha> findAll(String owner){

        String sql =  "SELECT * from alpha where OWNER in (:owner)" ;

        NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(abcJdbc.getDataSource());


        namedParameters = new MapSqlParameterSource("owner", owner);


        List<Alpha> list  = namedParameterJdbcTemplate.query(sql,namedParameters,
                new BeanPropertyRowMapper(Alpha.class));

        return list;
    }

B 项目休息 Controller :

AlphaServiceApplication.java

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class AlphaServiceApplication extends SpringBootServletInitializer implements WebApplicationInitializer {


    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(AlphaServiceApplication.class);
    }

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

AlphaServiceController.java

@RestController
public class AlphaServiceController {

    private static final Logger logger = LoggerFactory.getLogger(AlphaServiceController.class);

    @Autowired
    AlphaDAO dao;

    @CrossOrigin(origins = "http://localhost:4200")
    @RequestMapping("/alpha")
    public Collection<Alpha> index(@RequestBody String owner) {
        return dao.findAll(owner);
    }

如果我尝试运行其余 Controller ,我会收到错误消息

<小时/>

应用程序无法启动

<小时/>

描述:

com.xyz.web.wip.AlphaService.AlphaServiceController 中的字段 dao 需要类型为“com.xyz.comp.wip.alphaComp.dao.AlphaDAO”的 bean,但无法找到。

行动:

考虑在您的配置中定义“com.xyz.comp.wip.alphaComp.dao.AlphaDAO”类型的 bean。

最佳答案

您的 AlphaDao 类没有多大意义,您正在尝试 Autowiring 两个字段,但您仍然有一个构造函数。
Spring 无法构建对象,因为构造函数上没有限定符。
您可以进行构造函数注入(inject)或字段注入(inject),但不应同时使用两者。 我建议使用构造函数注入(inject)。

@Repository
public class AlphaDAO{

    private final JdbcTemplate abcJdbc;
    private final JdbcTemplate xyzJdbc;

    @Autowired
    public AlphaDAO(
          @Qualifier("abcJdbc") JdbcTemplate abcJdbc, 
          @Qualifier("xyzJdbc") JdbcTemplate xyzJdbc){
        this.abcJdbc = abcJdbc;
        this.xyzJdbc = xyzJdbc;
    }

同时从 Controller 中删除您的 @Bean 方法。

关于java - 使用 JdbcTemplate 访问多个数据源会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45926459/

相关文章:

java - 如何在 Spring WebFlux 中配置背压?

java - 无法禁用远程 Spring Boot JMX 访问

java - 禁用上下文 LOB 创建,因为 JDBC 驱动程序报告 JDBC 版本 [3] 小于 4

java - 如何在jdbctemplate中使用groupBy进行查询

Java:遍历目录中的 HTML 文件

java - 为什么不使用 signalAll 激活等待线程?

java - 在 Eclipse 中可能发生在 IntelliJ 中不可能的事情?

java - 如何测试 Spring Boot 处理程序拦截器

java - 在 Spring Boot 中使用 PostgreSQL 驱动程序创建数据源时出现异常

java - 使用 java ForkJoinPool 调用 JdbcTemplate batchUpdate()