Skip to content

Commit 6def699

Browse files
committed
Merge pull request #40986 from asashour
* pr/40986: Polish "Auto-configure SpringLiquibase with Liquibase Customizer" Auto-configure SpringLiquibase with Liquibase Customizer Closes gh-40986
2 parents a55cebd + 6aeab44 commit 6def699

File tree

3 files changed

+49
-2
lines changed

3 files changed

+49
-2
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818

1919
import javax.sql.DataSource;
2020

21+
import liquibase.Liquibase;
2122
import liquibase.UpdateSummaryEnum;
2223
import liquibase.UpdateSummaryOutputEnum;
2324
import liquibase.change.DatabaseChange;
25+
import liquibase.integration.spring.Customizer;
2426
import liquibase.integration.spring.SpringLiquibase;
2527
import liquibase.ui.UIServiceEnum;
2628

@@ -66,6 +68,7 @@
6668
* @author Ferenc Gratzer
6769
* @author Evgeniy Cheban
6870
* @author Moritz Halbritter
71+
* @author Ahmed Ashour
6972
* @since 1.1.0
7073
*/
7174
@AutoConfiguration(after = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
@@ -95,9 +98,9 @@ PropertiesLiquibaseConnectionDetails liquibaseConnectionDetails(LiquibasePropert
9598
}
9699

97100
@Bean
98-
public SpringLiquibase liquibase(ObjectProvider<DataSource> dataSource,
101+
SpringLiquibase liquibase(ObjectProvider<DataSource> dataSource,
99102
@LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource, LiquibaseProperties properties,
100-
LiquibaseConnectionDetails connectionDetails) {
103+
ObjectProvider<SpringLiquibaseCustomizer> customizers, LiquibaseConnectionDetails connectionDetails) {
101104
SpringLiquibase liquibase = createSpringLiquibase(liquibaseDataSource.getIfAvailable(),
102105
dataSource.getIfUnique(), connectionDetails);
103106
liquibase.setChangeLog(properties.getChangeLog());
@@ -125,6 +128,7 @@ public SpringLiquibase liquibase(ObjectProvider<DataSource> dataSource,
125128
if (properties.getUiService() != null) {
126129
liquibase.setUiService(UIServiceEnum.valueOf(properties.getUiService().name()));
127130
}
131+
customizers.orderedStream().forEach((customizer) -> customizer.customize(liquibase));
128132
return liquibase;
129133
}
130134

@@ -173,6 +177,17 @@ private void applyConnectionDetails(LiquibaseConnectionDetails connectionDetails
173177

174178
}
175179

180+
@ConditionalOnClass(Customizer.class)
181+
static class CustomizerConfiguration {
182+
183+
@Bean
184+
@ConditionalOnBean(Customizer.class)
185+
SpringLiquibaseCustomizer customizerSpringLiquibaseCustomizer(Customizer<Liquibase> customizer) {
186+
return (springLiquibase) -> springLiquibase.setCustomizer(customizer);
187+
}
188+
189+
}
190+
176191
static final class LiquibaseDataSourceCondition extends AnyNestedCondition {
177192

178193
LiquibaseDataSourceCondition() {
@@ -239,4 +254,15 @@ public String getDriverClassName() {
239254

240255
}
241256

257+
@FunctionalInterface
258+
private interface SpringLiquibaseCustomizer {
259+
260+
/**
261+
* Customize the given {@link SpringLiquibase} instance.
262+
* @param springLiquibase the instance to configure
263+
*/
264+
void customize(SpringLiquibase springLiquibase);
265+
266+
}
267+
242268
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfigurationTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929
import javax.sql.DataSource;
3030

3131
import com.zaxxer.hikari.HikariDataSource;
32+
import liquibase.Liquibase;
3233
import liquibase.UpdateSummaryEnum;
3334
import liquibase.UpdateSummaryOutputEnum;
3435
import liquibase.command.core.helpers.ShowSummaryArgument;
36+
import liquibase.integration.spring.Customizer;
3537
import liquibase.integration.spring.SpringLiquibase;
3638
import liquibase.ui.UIServiceEnum;
3739
import org.junit.jupiter.api.Test;
@@ -83,6 +85,7 @@
8385
* @author Evgeniy Cheban
8486
* @author Moritz Halbritter
8587
* @author Phillip Webb
88+
* @author Ahmed Ashour
8689
*/
8790
@ExtendWith(OutputCaptureExtension.class)
8891
class LiquibaseAutoConfigurationTests {
@@ -532,6 +535,12 @@ void shouldRegisterHints() {
532535
assertThat(RuntimeHintsPredicates.resource().forResource("db/changelog/tables/init.sql")).accepts(hints);
533536
}
534537

538+
@Test
539+
void whenCustomizerBeanIsDefinedThenItIsConfiguredOnSpringLiquibase() {
540+
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, CustomizerConfiguration.class)
541+
.run(assertLiquibase((liquibase) -> assertThat(liquibase.getCustomizer()).isNotNull()));
542+
}
543+
535544
private ContextConsumer<AssertableApplicationContext> assertLiquibase(Consumer<SpringLiquibase> consumer) {
536545
return (context) -> {
537546
assertThat(context).hasSingleBean(SpringLiquibase.class);
@@ -668,6 +677,16 @@ public String getPassword() {
668677

669678
}
670679

680+
@Configuration(proxyBeanMethods = false)
681+
static class CustomizerConfiguration {
682+
683+
@Bean
684+
Customizer<Liquibase> customizer() {
685+
return (liquibase) -> liquibase.setChangeLogParameter("some key", "some value");
686+
}
687+
688+
}
689+
671690
static class CustomH2Driver extends org.h2.Driver {
672691

673692
}

spring-boot-project/spring-boot-docs/src/docs/antora/modules/how-to/pages/data-initialization.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ If any of the three properties has not been set, the value of its equivalent `sp
187187

188188
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.
189189

190+
You can also use a `Customizer<Liquibase>` bean if you want to customize the `Liquibase` instance before it is being used.
191+
190192

191193

192194
[[howto.data-initialization.migration-tool.flyway-tests]]

0 commit comments

Comments
 (0)