簡體   English   中英

登錄后的Spring BootEntityManagerFactory初始化

[英]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。

UPDATE

春季啟動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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM