Skip to content

Commit 960c03d

Browse files
committed
Merge pull request #16850 from Ilya Lukyanovich
* gh-16850: Polish "Auto-configure Flyway and Liquibase when there's a URL but no DataSource" Auto-configure Flyway and Liquibase when there's a URL but no DataSource Closes gh-16850
2 parents f59e337 + 8807215 commit 960c03d

File tree

4 files changed

+71
-4
lines changed

4 files changed

+71
-4
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@
3636
import org.springframework.beans.factory.ObjectProvider;
3737
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3838
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
39+
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
3940
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
4041
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
4142
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
4243
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
4344
import org.springframework.boot.autoconfigure.data.jpa.EntityManagerFactoryDependsOnPostProcessor;
45+
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayDataSourceCondition;
4446
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
4547
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
4648
import org.springframework.boot.autoconfigure.jdbc.JdbcOperationsDependsOnPostProcessor;
@@ -52,6 +54,7 @@
5254
import org.springframework.boot.context.properties.PropertyMapper;
5355
import org.springframework.boot.jdbc.DatabaseDriver;
5456
import org.springframework.context.annotation.Bean;
57+
import org.springframework.context.annotation.Conditional;
5558
import org.springframework.context.annotation.Configuration;
5659
import org.springframework.core.convert.TypeDescriptor;
5760
import org.springframework.core.convert.converter.GenericConverter;
@@ -82,7 +85,7 @@
8285
@SuppressWarnings("deprecation")
8386
@Configuration(proxyBeanMethods = false)
8487
@ConditionalOnClass(Flyway.class)
85-
@ConditionalOnBean(DataSource.class)
88+
@Conditional(FlywayDataSourceCondition.class)
8689
@ConditionalOnProperty(prefix = "spring.flyway", name = "enabled", matchIfMissing = true)
8790
@AutoConfigureAfter({ DataSourceAutoConfiguration.class,
8891
JdbcTemplateAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
@@ -462,4 +465,23 @@ public Object convert(Object source, TypeDescriptor sourceType,
462465

463466
}
464467

468+
static final class FlywayDataSourceCondition extends AnyNestedCondition {
469+
470+
FlywayDataSourceCondition() {
471+
super(ConfigurationPhase.REGISTER_BEAN);
472+
}
473+
474+
@ConditionalOnBean(DataSource.class)
475+
private static final class DataSourceBeanCondition {
476+
477+
}
478+
479+
@ConditionalOnProperty(prefix = "spring.flyway", name = "url",
480+
matchIfMissing = false)
481+
private static final class FlywayUrlCondition {
482+
483+
}
484+
485+
}
486+
465487
}

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

+23-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.beans.factory.ObjectProvider;
2929
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3030
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
31+
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
3132
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3233
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3334
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -37,10 +38,12 @@
3738
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
3839
import org.springframework.boot.autoconfigure.jdbc.JdbcOperationsDependsOnPostProcessor;
3940
import org.springframework.boot.autoconfigure.jdbc.NamedParameterJdbcOperationsDependsOnPostProcessor;
41+
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseDataSourceCondition;
4042
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
4143
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4244
import org.springframework.boot.jdbc.DataSourceBuilder;
4345
import org.springframework.context.annotation.Bean;
46+
import org.springframework.context.annotation.Conditional;
4447
import org.springframework.context.annotation.Configuration;
4548
import org.springframework.context.annotation.Import;
4649
import org.springframework.core.io.Resource;
@@ -65,9 +68,9 @@
6568
*/
6669
@Configuration(proxyBeanMethods = false)
6770
@ConditionalOnClass({ SpringLiquibase.class, DatabaseChange.class })
68-
@ConditionalOnBean(DataSource.class)
6971
@ConditionalOnProperty(prefix = "spring.liquibase", name = "enabled",
7072
matchIfMissing = true)
73+
@Conditional(LiquibaseDataSourceCondition.class)
7174
@AutoConfigureAfter({ DataSourceAutoConfiguration.class,
7275
HibernateJpaAutoConfiguration.class })
7376
public class LiquibaseAutoConfiguration {
@@ -225,4 +228,23 @@ public LiquibaseNamedParameterJdbcOperationsDependencyConfiguration() {
225228

226229
}
227230

231+
static final class LiquibaseDataSourceCondition extends AnyNestedCondition {
232+
233+
LiquibaseDataSourceCondition() {
234+
super(ConfigurationPhase.REGISTER_BEAN);
235+
}
236+
237+
@ConditionalOnBean(DataSource.class)
238+
private static final class DataSourceBeanCondition {
239+
240+
}
241+
242+
@ConditionalOnProperty(prefix = "spring.liquibase", name = "url",
243+
matchIfMissing = false)
244+
private static final class LiquibaseUrlCondition {
245+
246+
}
247+
248+
}
249+
228250
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,22 @@ public class FlywayAutoConfigurationTests {
7979
.withPropertyValues("spring.datasource.generate-unique-name=true");
8080

8181
@Test
82-
public void noDataSource() {
82+
public void backsOffWithNoDataSourceBeanAndNoFlywayUrl() {
8383
this.contextRunner
8484
.run((context) -> assertThat(context).doesNotHaveBean(Flyway.class));
8585
}
8686

87+
@Test
88+
public void createsDataSourceWithNoDataSourceBeanAndFlywayUrl() {
89+
this.contextRunner
90+
.withPropertyValues(
91+
"spring.flyway.url:jdbc:hsqldb:mem:" + UUID.randomUUID())
92+
.run((context) -> {
93+
assertThat(context).hasSingleBean(Flyway.class);
94+
assertThat(context.getBean(Flyway.class).getDataSource()).isNotNull();
95+
});
96+
}
97+
8798
@Test
8899
public void createDataSourceWithUrl() {
89100
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,23 @@ public void init() {
7878
.withPropertyValues("spring.datasource.generate-unique-name=true");
7979

8080
@Test
81-
public void noDataSource() {
81+
public void backsOffWithNoDataSourceBeanAndNoLiquibaseUrl() {
8282
this.contextRunner.run(
8383
(context) -> assertThat(context).doesNotHaveBean(SpringLiquibase.class));
8484
}
8585

86+
@Test
87+
public void createsDataSourceWithNoDataSourceBeanAndLiquibaseUrl() {
88+
this.contextRunner
89+
.withPropertyValues("spring.liquibase.url:jdbc:hsqldb:mem:liquibase")
90+
.run(assertLiquibase((liquibase) -> {
91+
DataSource dataSource = liquibase.getDataSource();
92+
assertThat(((HikariDataSource) dataSource).isClosed()).isTrue();
93+
assertThat(((HikariDataSource) dataSource).getJdbcUrl())
94+
.isEqualTo("jdbc:hsqldb:mem:liquibase");
95+
}));
96+
}
97+
8698
@Test
8799
public void defaultSpringLiquibase() {
88100
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)

0 commit comments

Comments
 (0)