我有两个项目,一个包含 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/