diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java index b2a684af5c53..8eaaf74d1f5c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java @@ -31,6 +31,7 @@ import org.flywaydb.core.api.MigrationVersion; import org.flywaydb.core.api.callback.Callback; import org.flywaydb.core.api.configuration.FluentConfiguration; +import org.flywaydb.core.api.migration.JavaMigration; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -112,7 +113,7 @@ public Flyway flyway(FlywayProperties properties, DataSourceProperties dataSourc ResourceLoader resourceLoader, ObjectProvider dataSource, @FlywayDataSource ObjectProvider flywayDataSource, ObjectProvider fluentConfigurationCustomizers, - ObjectProvider callbacks) { + ObjectProvider javaMigrations, ObjectProvider callbacks) { FluentConfiguration configuration = new FluentConfiguration(resourceLoader.getClassLoader()); DataSource dataSourceToMigrate = configureDataSource(configuration, properties, dataSourceProperties, flywayDataSource.getIfAvailable(), dataSource.getIfAvailable()); @@ -122,6 +123,8 @@ public Flyway flyway(FlywayProperties properties, DataSourceProperties dataSourc configureCallbacks(configuration, orderedCallbacks); fluentConfigurationCustomizers.orderedStream().forEach((customizer) -> customizer.customize(configuration)); configureFlywayCallbacks(configuration, orderedCallbacks); + JavaMigration[] migrations = javaMigrations.stream().toArray(JavaMigration[]::new); + configuration.javaMigrations(migrations); return configuration.load(); } 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 1a4e0cd4c42f..7270a75bdd1a 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 @@ -29,6 +29,7 @@ import org.flywaydb.core.api.callback.Callback; import org.flywaydb.core.api.callback.Context; import org.flywaydb.core.api.callback.Event; +import org.flywaydb.core.api.migration.JavaMigration; import org.flywaydb.core.internal.license.FlywayProUpgradeRequiredException; import org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform; import org.junit.jupiter.api.Test; @@ -264,6 +265,16 @@ void customFlywayMigrationStrategy() { }); } + @Test + void flywayJavaMigrations() { + this.contextRunner + .withUserConfiguration(EmbeddedDataSourceConfiguration.class, FlywayJavaMigrationsConfiguration.class) + .run((context) -> { + Flyway flyway = context.getBean(Flyway.class); + assertThat(flyway.getConfiguration().getJavaMigrations().length).isEqualTo(2); + }); + } + @Test void customFlywayMigrationInitializer() { this.contextRunner @@ -471,6 +482,81 @@ DataSource flywayDataSource() { } + @Configuration + protected static class FlywayJavaMigrationsConfiguration { + + @Component + private static class Migration1 implements JavaMigration { + + @Override + public MigrationVersion getVersion() { + return MigrationVersion.fromVersion("2"); + } + + @Override + public String getDescription() { + return "M1"; + } + + @Override + public Integer getChecksum() { + return 1; + } + + @Override + public boolean isUndo() { + return false; + } + + @Override + public boolean canExecuteInTransaction() { + return true; + } + + @Override + public void migrate(org.flywaydb.core.api.migration.Context context) throws Exception { + + } + + } + + @Component + private static class Migration2 implements JavaMigration { + + @Override + public MigrationVersion getVersion() { + return MigrationVersion.fromVersion("3"); + } + + @Override + public String getDescription() { + return "M2"; + } + + @Override + public Integer getChecksum() { + return 2; + } + + @Override + public boolean isUndo() { + return false; + } + + @Override + public boolean canExecuteInTransaction() { + return false; + } + + @Override + public void migrate(org.flywaydb.core.api.migration.Context context) throws Exception { + + } + + } + + } + @Configuration(proxyBeanMethods = false) static class ResourceLoaderConfiguration {