我使用Spring Boot框架开发了两个web服务,我将它们放在同一个项目中。每个Web服务使用不同的DB,比如说ws1使用Oracle1而ws2使用Oracle2。我已经使用bean定义定义了一个DataBaseConfig,但是当我运行应用程序时,总是运行一个web服务(并且它始终是相同的)。
DataBaseConfig
@Configuration
public class DataBaseConfig {
@Bean(name = "ora1")
@ConfigurationProperties(prefix="spring.datasource")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();}
@Bean(name = "ora2")
@ConfigurationProperties(prefix="spring.secondDatasource")
public DataSource sqliteDataSource() {
return DataSourceBuilder.create().build();}
@Bean(name = "clients")
@Autowired
@ConfigurationProperties(prefix = "spring.datasource")
@Qualifier("datasource")
public JdbcTemplate slaveJdbcTemplate(DataSource datasource) {
return new JdbcTemplate(datasource); }
@Bean(name = "places")
@Autowired
@Primary
@ConfigurationProperties(prefix = "spring.secondDatasource")
@Qualifier("secondDatasource")
public JdbcTemplate masterJdbcTemplate(DataSource secondDatasource) {
return new JdbcTemplate(secondDatasource);}
}
我的服务定义包含sql语句和定义
@Service
public class ClientsService {
@Autowired
@Qualifier("clients")
private JdbcTemplate jdbcTemplate;
和其他服务
@Service
public class PlacesService {
@Autowired
@Qualifier("places")
private JdbcTemplate jdbcTemplate;
然后在每个控制器中我都映射了@RequestMapping。当我运行应用程序时,我没有与连接相关的错误,如果我将2个项目中的webservices分开,每个都可以正常工作。
答案 0 :(得分:0)
这里有一些问题,包括一些不必要的注释。请参阅下文,注意@Qualifier的位置和限定符名称:
@Bean(name = "clients")
public JdbcTemplate slaveJdbcTemplate(@Qualifier("ora1") DataSource datasource) {
return new JdbcTemplate(datasource);
}
@Bean(name = "places")
@Primary
public JdbcTemplate masterJdbcTemplate(@Qualifier("ora2") DataSource secondDatasource) {
return new JdbcTemplate(secondDatasource);
}
答案 1 :(得分:0)
不是通过bean名称解析,这是一个坏主意IMO,因为它不是类型安全的,为什么不使用构造函数注入并在配置类中创建服务(ditch @Service
注解)。像往常一样创建DataSource
和JdbcTemplate
bean,不要给它们任何名称(默认是方法名称),还要创建new PlacesService(placesJdbcTemplate())
。结果是更简单的代码。
这假设您希望两个数据库在运行时都处于活动状态。如果没有,请使用@Profile
。