From 78941c32c48d671aa53a0739f64c4aa80487eac7 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 16 Feb 2021 12:04:59 +0000 Subject: [PATCH] Polish "Ensure that Flyway/Liquibase run before jOOQ's DSLContext is used" See gh-25279 --- .../liquibase/LiquibaseAutoConfiguration.java | 14 ++--- .../flyway/FlywayAutoConfigurationTests.java | 62 ++++++++----------- .../LiquibaseAutoConfigurationTests.java | 11 +++- 3 files changed, 44 insertions(+), 43 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java index 9c70170b735b..ffc24fbc8da0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java @@ -167,8 +167,8 @@ private String getProperty(Supplier property, Supplier defaultVa } /** - * Post processor to ensure that {@link EntityManagerFactory} beans depend on the - * liquibase bean. + * Post processor to ensure that {@link EntityManagerFactory} beans depend on any + * {@link SpringLiquibase} beans. */ @ConditionalOnClass(LocalContainerEntityManagerFactoryBean.class) @ConditionalOnBean(AbstractEntityManagerFactoryBean.class) @@ -182,8 +182,8 @@ static class LiquibaseEntityManagerFactoryDependsOnPostProcessor } /** - * Additional configuration to ensure that {@link JdbcOperations} beans depend on the - * liquibase bean. + * Additional configuration to ensure that {@link JdbcOperations} beans depend on any + * {@link SpringLiquibase} beans. */ @ConditionalOnClass(JdbcOperations.class) @ConditionalOnBean(JdbcOperations.class) @@ -197,7 +197,7 @@ static class LiquibaseJdbcOperationsDependsOnPostProcessor extends JdbcOperation /** * Post processor to ensure that {@link NamedParameterJdbcOperations} beans depend on - * the liquibase bean. + * any {@link SpringLiquibase} beans. */ @ConditionalOnClass(NamedParameterJdbcOperations.class) @ConditionalOnBean(NamedParameterJdbcOperations.class) @@ -211,8 +211,8 @@ static class LiquibaseNamedParameterJdbcOperationsDependsOnPostProcessor } /** - * Post processor to ensure that {@link DSLContext} beans depend on the liquibase - * bean. + * Post processor to ensure that {@link DSLContext} beans depend on any + * {@link SpringLiquibase} beans. */ @ConditionalOnClass(DSLContext.class) @ConditionalOnBean(DSLContext.class) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java index ebe496c6ab14..0f4239dc4c2e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java @@ -525,24 +525,32 @@ void initSqlsWithFlywayUrl() { } @Test - void userConfigurationDslContextDependency() { - this.contextRunner - .withUserConfiguration(EmbeddedDataSourceConfiguration.class, CustomFlywayWithJooqConfiguration.class) + void whenFlywayIsAutoConfiguredThenJooqDslContextDependsOnFlywayBeans() { + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class) .run((context) -> { BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext"); - assertThat(beanDefinition.getDependsOn()).containsExactly("flyway"); + assertThat(beanDefinition.getDependsOn()).containsExactly("flywayInitializer", "flyway"); }); } @Test - void userConfigurationWithFlywayMigrationAndDslContextDependency() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, - CustomFlywayMigrationInitializerWithJooqConfiguration.class).run((context) -> { + void whenCustomMigrationInitializerIsDefinedThenJooqDslContextDependsOnIt() { + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class, + CustomFlywayMigrationInitializer.class).run((context) -> { BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext"); assertThat(beanDefinition.getDependsOn()).containsExactly("flywayMigrationInitializer", "flyway"); }); } + @Test + void whenCustomFlywayIsDefinedThenJooqDslContextDependsOnIt() { + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, JooqConfiguration.class, + CustomFlyway.class).run((context) -> { + BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext"); + assertThat(beanDefinition.getDependsOn()).containsExactly("customFlyway"); + }); + } + @Configuration(proxyBeanMethods = false) static class FlywayDataSourceConfiguration { @@ -619,6 +627,16 @@ FlywayMigrationInitializer flywayMigrationInitializer(Flyway flyway) { } + @Configuration(proxyBeanMethods = false) + static class CustomFlyway { + + @Bean + Flyway customFlyway() { + return Flyway.configure().load(); + } + + } + @Configuration(proxyBeanMethods = false) static class CustomFlywayMigrationInitializerWithJpaConfiguration { @@ -771,34 +789,8 @@ FlywayConfigurationCustomizer customizerTwo() { } - @Configuration - static class CustomFlywayWithJooqConfiguration { - - @Bean - Flyway flyway(DataSource dataSource) { - return Flyway.configure().dataSource(dataSource).load(); - } - - @Bean - DSLContext dslContext() { - return new DefaultDSLContext(SQLDialect.H2); - } - - } - - @Configuration - protected static class CustomFlywayMigrationInitializerWithJooqConfiguration { - - private final DataSource dataSource; - - protected CustomFlywayMigrationInitializerWithJooqConfiguration(DataSource dataSource) { - this.dataSource = dataSource; - } - - @Bean - public FlywayMigrationInitializer flywayMigrationInitializer(Flyway flyway) { - return new FlywayMigrationInitializer(flyway); - } + @Configuration(proxyBeanMethods = false) + static class JooqConfiguration { @Bean DSLContext dslContext() { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfigurationTests.java index 6ea18343e73e..c7b77c6f5bd2 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfigurationTests.java @@ -376,7 +376,16 @@ void overrideTag() { } @Test - void userConfigurationDslContextDependency() { + void whenLiquibaseIsAutoConfiguredThenJooqDslContextDependsOnSpringLiquibaseBeans() { + this.contextRunner.withConfiguration(AutoConfigurations.of(JooqAutoConfiguration.class)) + .withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> { + BeanDefinition beanDefinition = context.getBeanFactory().getBeanDefinition("dslContext"); + assertThat(beanDefinition.getDependsOn()).containsExactly("liquibase"); + }); + } + + @Test + void whenCustomSpringLiquibaseIsDefinedThenJooqDslContextDependsOnSpringLiquibaseBeans() { this.contextRunner.withConfiguration(AutoConfigurations.of(JooqAutoConfiguration.class)) .withUserConfiguration(LiquibaseUserConfiguration.class, EmbeddedDataSourceConfiguration.class) .run((context) -> {