весенняя загрузка entityManagerFactory инициализации после входа в систему - PullRequest
0 голосов
/ 05 февраля 2019

Я разрабатываю приложение JavaFX с весенней загрузкой.Это приложение использует локальную базу данных (H2), однако свойства соединения с базой данных, такие как имя базы данных, имя пользователя и пароль, вводятся пользователем на экране входа в систему.

Но весенняя загрузка инициализирует все bean-компоненты, определенные в AppConfig.java, иЯ не могу инициализировать сцену javafx для отображения пользовательского интерфейса.

Помещение аннотации @EnableAutoConfiguration исключение не помогает.

@SpringBootApplication
@EnableAutoConfiguration(exclude= {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})   
public class MyApplication extends Application {

весенняя загрузка по-прежнему пытается подключиться к базе данных.

Конечно, как только пользователь вводит имя базы данных, имя пользователя / пароль, весенняя загрузка должна инициализировать bean-компоненты, связанные с базой данных, или каким-либо образом вызывать весеннюю загрузку для инициализации, потому что в дальнейшем они требуются для функциональности приложения.

Спасибо за любую подсказку!

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Я бы рекомендовал избегать использования пружинной начальной загрузки JPA и свойств источника данных для инициализации.

Сохраните свойства источника данных, но присвойте ему имя, которое не будет искать весенняя загрузка. Затем я инициализирую источник данных при входе в систему с помощьюсоздание объекта DataSource.

Другой вариант - определить bean-компонент dataSource и отметить его как ленивый.

0 голосов
/ 05 февраля 2019

Вы можете предоставить свой собственный компонент 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

Spring Boot JPA автоконфигурация пытается подключитьсяк базе данных во время инициализации bean-компонентов (т. е. JpaVendorAdapter bean-компонент в JpaBaseConfiguration), таким образом, обеспечение оболочки источника данных не будет выполнять эту работу.

Возможное решение можно найти здесь .

0 голосов
/ 05 февраля 2019

Звучит так, будто вы хотите что-то вроде динамического / ленивого компонента источника данных.Вы можете попытаться сделать это, создав пользовательскую реализацию RoutingDatasource, расширяющую org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource .

. Вы можете выполнить поиск по SessionRoutingDataSource, DynamicRoutingDatasant, если хотите получить или получить какой-либо другой результатпримеры.

Вы можете попробовать поработать с каким-либо видом NoopDatasource в RoutingDatasource для сценариев, где вам нужен источник данных, но пользователь еще не предоставил кредиты.

0 голосов
/ 05 февраля 2019

Вы можете попробовать запустить экран входа в систему до весенней загрузки, а затем установить введенные значения в качестве системных свойств.И после этого запускаю 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...