我的应用程序中定义了两个用于DataConnection的Bean。
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
public class ApplicationConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix="spring.datasource")
public DataSource primaryDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://172.17.0.3:3306/gcdb");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean
@ConfigurationProperties(prefix="spring.seconddatasource")
public DataSource secondaryDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:gcdboff");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
}
但是因为有时我们没有与Internet的任何连接,所以不是在每次启动时都创建第一个bean,而是由于链接连接错误而崩溃。
我必须做的是,以便我的应用程序无一例外地识别出第一个配置无效,因此必须采取第二个配置。
谢谢您的帮助!
答案 0 :(得分:1)
我认为您不能抛出异常并让Spring Boot搜索另一个bean。
您可以在@Primary
DataSource bean中测试两个DataSource,然后返回在线的DataSource。
我已经看到您使用@ConfigurationProperties
,所以我想您不会直接在代码中调用dataSource.setPassword
。在下面的示例中,所有必需的信息都将从您的配置中读取。
@Primary
@Bean
public DataSource getDataSource(
@Qualifier("first") DataSourceProperties first,
@Qualifier("second") DataSourceProperties second) {
final DataSource firstDataSource = first.initializeDataSourceBuilder().build();
// try {
// firstDataSource.getConnection();
// ...
// } catch (SQLException e) {
// ...
// }
// return firstDataSource or secondDataSource;
}
@Primary
@Bean("first")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSourceProperties getPrimaryStringProvider() {
final DataSourceProperties dataSourceProperties = new DataSourceProperties();
return dataSourceProperties;
}
@Bean("second")
@ConfigurationProperties("spring.seconddatasource")
public DataSourceProperties getSecondaryStringProvider() {
return new DataSourceProperties();
}
LE作为对以下评论的回复:
该异常是错误的。他从未进入捕捞区。您必须使用通信异常或其自身的异常。
它将抛出SQLException(更确切地说,对于MySQL,它可能是com.mysql.jdbc.public class CommunicationsException extends java.sql.SQLException
)。
此外,我还必须在Application类中输入bean。否则,这些豆就永远无法建成。
您只需要用ApplicationConfiguration
注释@Configuration
。
我在问题中发布了可行的解决方案
我认为用@ConfigurationProperties(prefix="spring.datasource")
注释该方法没有多大意义。退出方法primaryDataSource
后,会使用属性文件中存在的所有值覆盖函数中设置的值。