mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-07-05 00:56:58 +08:00
Merge pull request #40986 from asashour
* pr/40986: Polish "Auto-configure SpringLiquibase with Liquibase Customizer" Auto-configure SpringLiquibase with Liquibase Customizer Closes gh-40986
This commit is contained in:
commit
6def699c3d
|
@ -18,9 +18,11 @@ package org.springframework.boot.autoconfigure.liquibase;
|
|||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import liquibase.Liquibase;
|
||||
import liquibase.UpdateSummaryEnum;
|
||||
import liquibase.UpdateSummaryOutputEnum;
|
||||
import liquibase.change.DatabaseChange;
|
||||
import liquibase.integration.spring.Customizer;
|
||||
import liquibase.integration.spring.SpringLiquibase;
|
||||
import liquibase.ui.UIServiceEnum;
|
||||
|
||||
|
@ -66,6 +68,7 @@ import org.springframework.util.StringUtils;
|
|||
* @author Ferenc Gratzer
|
||||
* @author Evgeniy Cheban
|
||||
* @author Moritz Halbritter
|
||||
* @author Ahmed Ashour
|
||||
* @since 1.1.0
|
||||
*/
|
||||
@AutoConfiguration(after = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
|
||||
|
@ -95,9 +98,9 @@ public class LiquibaseAutoConfiguration {
|
|||
}
|
||||
|
||||
@Bean
|
||||
public SpringLiquibase liquibase(ObjectProvider<DataSource> dataSource,
|
||||
SpringLiquibase liquibase(ObjectProvider<DataSource> dataSource,
|
||||
@LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource, LiquibaseProperties properties,
|
||||
LiquibaseConnectionDetails connectionDetails) {
|
||||
ObjectProvider<SpringLiquibaseCustomizer> customizers, LiquibaseConnectionDetails connectionDetails) {
|
||||
SpringLiquibase liquibase = createSpringLiquibase(liquibaseDataSource.getIfAvailable(),
|
||||
dataSource.getIfUnique(), connectionDetails);
|
||||
liquibase.setChangeLog(properties.getChangeLog());
|
||||
|
@ -125,6 +128,7 @@ public class LiquibaseAutoConfiguration {
|
|||
if (properties.getUiService() != null) {
|
||||
liquibase.setUiService(UIServiceEnum.valueOf(properties.getUiService().name()));
|
||||
}
|
||||
customizers.orderedStream().forEach((customizer) -> customizer.customize(liquibase));
|
||||
return liquibase;
|
||||
}
|
||||
|
||||
|
@ -173,6 +177,17 @@ public class LiquibaseAutoConfiguration {
|
|||
|
||||
}
|
||||
|
||||
@ConditionalOnClass(Customizer.class)
|
||||
static class CustomizerConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnBean(Customizer.class)
|
||||
SpringLiquibaseCustomizer customizerSpringLiquibaseCustomizer(Customizer<Liquibase> customizer) {
|
||||
return (springLiquibase) -> springLiquibase.setCustomizer(customizer);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static final class LiquibaseDataSourceCondition extends AnyNestedCondition {
|
||||
|
||||
LiquibaseDataSourceCondition() {
|
||||
|
@ -239,4 +254,15 @@ public class LiquibaseAutoConfiguration {
|
|||
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
private interface SpringLiquibaseCustomizer {
|
||||
|
||||
/**
|
||||
* Customize the given {@link SpringLiquibase} instance.
|
||||
* @param springLiquibase the instance to configure
|
||||
*/
|
||||
void customize(SpringLiquibase springLiquibase);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -29,9 +29,11 @@ import java.util.function.Consumer;
|
|||
import javax.sql.DataSource;
|
||||
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import liquibase.Liquibase;
|
||||
import liquibase.UpdateSummaryEnum;
|
||||
import liquibase.UpdateSummaryOutputEnum;
|
||||
import liquibase.command.core.helpers.ShowSummaryArgument;
|
||||
import liquibase.integration.spring.Customizer;
|
||||
import liquibase.integration.spring.SpringLiquibase;
|
||||
import liquibase.ui.UIServiceEnum;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
@ -83,6 +85,7 @@ import static org.assertj.core.api.Assertions.contentOf;
|
|||
* @author Evgeniy Cheban
|
||||
* @author Moritz Halbritter
|
||||
* @author Phillip Webb
|
||||
* @author Ahmed Ashour
|
||||
*/
|
||||
@ExtendWith(OutputCaptureExtension.class)
|
||||
class LiquibaseAutoConfigurationTests {
|
||||
|
@ -532,6 +535,12 @@ class LiquibaseAutoConfigurationTests {
|
|||
assertThat(RuntimeHintsPredicates.resource().forResource("db/changelog/tables/init.sql")).accepts(hints);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenCustomizerBeanIsDefinedThenItIsConfiguredOnSpringLiquibase() {
|
||||
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, CustomizerConfiguration.class)
|
||||
.run(assertLiquibase((liquibase) -> assertThat(liquibase.getCustomizer()).isNotNull()));
|
||||
}
|
||||
|
||||
private ContextConsumer<AssertableApplicationContext> assertLiquibase(Consumer<SpringLiquibase> consumer) {
|
||||
return (context) -> {
|
||||
assertThat(context).hasSingleBean(SpringLiquibase.class);
|
||||
|
@ -668,6 +677,16 @@ class LiquibaseAutoConfigurationTests {
|
|||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class CustomizerConfiguration {
|
||||
|
||||
@Bean
|
||||
Customizer<Liquibase> customizer() {
|
||||
return (liquibase) -> liquibase.setChangeLogParameter("some key", "some value");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class CustomH2Driver extends org.h2.Driver {
|
||||
|
||||
}
|
||||
|
|
|
@ -187,6 +187,8 @@ If any of the three properties has not been set, the value of its equivalent `sp
|
|||
|
||||
See xref:api:java/org/springframework/boot/autoconfigure/liquibase/LiquibaseProperties.html[`LiquibaseProperties`] for details about available settings such as contexts, the default schema, and others.
|
||||
|
||||
You can also use a `Customizer<Liquibase>` bean if you want to customize the `Liquibase` instance before it is being used.
|
||||
|
||||
|
||||
|
||||
[[howto.data-initialization.migration-tool.flyway-tests]]
|
||||
|
|
Loading…
Reference in New Issue
Block a user