[英]spring boot entityManagerFactory initialization after login
我用Spring Boot開發了JavaFX應用程序。 該應用程序使用本地數據庫(H2),但是數據庫連接屬性(如數據庫名稱,用戶名,密碼)由用戶在登錄屏幕上輸入。
但是Spring Boot會初始化AppConfig.java中定義的所有bean,並且我無法初始化javafx場景來顯示UI。
將exclude放入@EnableAutoConfiguration注釋無濟於事。
@SpringBootApplication
@EnableAutoConfiguration(exclude= {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class MyApplication extends Application {
spring boot仍然嘗試連接到數據庫。
當然,一旦用戶輸入了數據庫名稱,用戶名/密碼,Spring Boot應該初始化與數據庫相關的Bean或以某種方式強制Spring Boot進行初始化,因為稍后它們是應用程序功能所必需的。
感謝您的提示!
您可以嘗試在春季引導之前啟動登錄屏幕,然后將輸入的值設置為系統屬性。 然后啟動Spring Boot:
public static void main(String[] args) {
// Start login screen
// For all properties the user entered
System.setProperty("spring.database.xy", "<value from UI>");
SpringApplication.run(Application.class, args);
}
您可以使用包裝器提供自己的DataSource bean,該包裝器僅在需要連接時才初始化數據源。
您的DataSource包裝器可能會提供 setUsername()
和setPassword()
您可以在嘗試登錄時使用它們。
我沒有嘗試過,但是請告訴我是否有問題。
public class AppDataSourceWrapper implements DataSource { private final DataSourceProperties dataSourceProperties; private String username; private String password; private DataSource dataSource; public AppDataSourceWrapper(DataSourceProperties dataSourceProperties) { this.dataSourceProperties = dataSourceProperties; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } private DataSource getDataSource() { if (dataSource == null) { initDataSource(); } return dataSource; } private void initDataSource() { this.dataSource = dataSourceProperties.initializeDataSourceBuilder() .username(username) .password(password) .build(); } @Override public Connection getConnection() throws SQLException { return getDataSource().getConnection(); } // other override methods omitted for brevity }
添加到您的配置中:
@Bean public DataSource dataSource(DataSourceProperties dataSourceProperties) { return new AppDataSourceWrapper(dataSourceProperties); }
根據用戶訪問請求,您可以執行以下操作:
AppDataSourceWrapper dsWrapper = (AppDataSourceWrapper) dataSource; dsWrapper.setUsername(username); dsWrapper.setPassword(password);
然后,應在首次嘗試連接時初始化DataSource。
春季啟動JPA自動配置嘗試豆初始化(即在連接到數據庫JpaVendorAdapter
豆在JpaBaseConfiguration
),從而提供一個數據源包裝不會做的工作。
可能的解決方案可以在這里找到。
在我看來,您需要一種動態/惰性數據源bean。 您可以嘗試通過創建自定義的RoutingDatasource實現來實現此目的,該實現擴展了org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 。
如果需要一些示例,可以搜索SessionRoutingDataSource,DynamicRoutingDatasource或MultitenantDatasource。
您可以在RoutingDatasource中嘗試使用某種NoopDatasource,以解決需要將數據源放在其中但用戶尚未提供憑據的情況。
我建議避免使用Spring Boot Starter JPA和數據源屬性進行初始化。
保留數據源的屬性,但將其命名為Spring Boot不需要的名稱。然后,我將在登錄時通過創建DataSource對象來初始化數據源。
另一個選擇是定義一個dataSource bean並將其標記為惰性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.