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