【发布时间】:2022-01-24 11:03:55
【问题描述】:
我正在连接到多个数据源,但有时某些数据源可能处于脱机状态,当时我在应用程序上遇到错误,并且应用程序在启动时失败。
我想在启动时跳过数据源配置...我尝试了几种方法添加
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
到 application.properties,我也尝试添加
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
到主类,但它仍然尝试配置数据源。
我还尝试在所有方法和构造函数上使用@Lazy 注释,如下所示,但在创建 fooEntityManagerFactory 时仍然出错
@Lazy
@Configuration
@EnableJpaRepositories(basePackages = "com.heyo.tayo.repository.foo", entityManagerFactoryRef = "fooEntityManagerFactory", transactionManagerRef = "fooTransactionManager")
public class PersistencefooConfiguration {
@Autowired
private DbContextHolder dbContextHolder;
@Lazy
@Bean
@ConfigurationProperties("tay.datasource.foo")
public DataSourceProperties fooDataSourceProperties() {
return new DataSourceProperties();
}
@Lazy
@Bean
@ConfigurationProperties("tay.datasource.foo.configuration")
public DataSource fooDataSource() {
DataSource dataSource = fooDataSourceProperties().initializeDataSourceBuilder()
.type(BasicDataSource.class).build();
dbContextHolder.addNewAvailableDbType(DbTypeEnum.foo);
return dataSource;
}
@Lazy
@Bean(name = "fooEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean fooEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
//THE CODE IS FAILING AT BELOW RETURN CASE
return builder
.dataSource(fooDataSource())
.packages("com.heyo.tayo.model.foo")
.build();
}
@Lazy
@Bean
public PlatformTransactionManager fooTransactionManager(
final @Qualifier("fooEntityManagerFactory") LocalContainerEntityManagerFactoryBean fooEntityManagerFactory) {
return new JpaTransactionManager(fooEntityManagerFactory.getObject());
}
}
我有多个像上面这样的类,用于不同数据源的不同配置,我将它们添加到数据源 Bean 的可用 dbs 静态列表中。
这是我的 dbadapter 工厂类。
这是我创建相应数据库适配器的 dbAdaptor 工厂
@Service
public class DbAdapterFactory {
@Autowired
private BeanFactory beanFactory;
@Autowired
private DbContextHolder dbContextHolder;
public DBAdapter dbAdapter(){
DbTypeEnum currentDb = dbContextHolder.getCurrentDb();
DBAdapter dbAdapter = null;
if(currentDb == DbTypeEnum.FOODB) {
dbAdapter = beanFactory.getBean(foodbadaptor.class);
} else {
dbAdapter = beanFactory.getBean(koodbadaptor.class);
}
return dbAdapter;
}
这里是数据库上下文持有者,它可以进行设置默认数据库或获取当前数据库等操作:
@Component
public class DbContextHolder {
private DbTypeEnum dbType = DbTypeEnum.FOODB;
private Set<DbTypeEnum> availableDbTypes = new HashSet<>();
public void setCurrentDb(DbTypeEnum dbType) {
this.dbType = dbType;
}
public DbTypeEnum getCurrentDb() {
return this.dbType;
}
public List<DbTypeEnum> getAvailableDbTypes() {
return new ArrayList<>(availableDbTypes);
}
public void addNewAvailableDbType(DbTypeEnum dbTypeEnum) {
availableDbTypes.add(dbTypeEnum);
}
}
我做了所有@Lazy 或尝试@SpringBootApplication(exclude={DataSourceAutoConfiguration.class}),但仍然有一些东西在调用创建bean 并出现错误并且应用程序正在关闭。我想在 try-catch 块中使用该配置和数据源,并且不要在运行时停止应用程序。我怎样才能实现这一点,或者我在配置或注释中缺少什么?
【问题讨论】:
标签: java spring spring-boot spring-data-jpa spring-annotations