From 52311ffe3cf085ccdaa22e930a686e6214784364 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 3 Sep 2019 12:45:17 +0100 Subject: [PATCH] Depend on FlywayMigrationInitializer beans by type not name Previously, a custom FlywayMigrationInitializer bean named anything other than flywayInitializer could result in a NoSucBeanDefinitionException as the dependencies set up for JPA and JDBC components used the bean name flywayInitializer. This commit updates the configuration of the dependencies to depend on FlywayMigrationInitializer beans by type rather than name. Fixes gh-18105 --- .../flyway/FlywayAutoConfiguration.java | 12 ++-- .../flyway/FlywayAutoConfigurationTests.java | 61 +++++++++++++++++++ 2 files changed, 67 insertions(+), 6 deletions(-) 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 d08f8219558..c57f37fd61a 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 @@ -265,7 +265,7 @@ public class FlywayAutoConfiguration { /** * Additional configuration to ensure that {@link EntityManagerFactory} beans - * depend on the {@code flywayInitializer} bean. + * depend on any {@link FlywayMigrationInitializer} beans. */ @Configuration @ConditionalOnClass(LocalContainerEntityManagerFactoryBean.class) @@ -274,14 +274,14 @@ public class FlywayAutoConfiguration { extends EntityManagerFactoryDependsOnPostProcessor { public FlywayInitializerJpaDependencyConfiguration() { - super("flywayInitializer"); + super(FlywayMigrationInitializer.class); } } /** * Additional configuration to ensure that {@link JdbcOperations} beans depend on - * the {@code flywayInitializer} bean. + * any {@link FlywayMigrationInitializer} beans. */ @Configuration @ConditionalOnClass(JdbcOperations.class) @@ -290,14 +290,14 @@ public class FlywayAutoConfiguration { extends JdbcOperationsDependsOnPostProcessor { public FlywayInitializerJdbcOperationsDependencyConfiguration() { - super("flywayInitializer"); + super(FlywayMigrationInitializer.class); } } /** * Additional configuration to ensure that {@link NamedParameterJdbcOperations} - * beans depend on the {@code flywayInitializer} bean. + * beans depend on any {@link FlywayMigrationInitializer} beans. */ @Configuration @ConditionalOnClass(NamedParameterJdbcOperations.class) @@ -306,7 +306,7 @@ public class FlywayAutoConfiguration { extends NamedParameterJdbcOperationsDependsOnPostProcessor { public FlywayInitializerNamedParameterJdbcOperationsDependencyConfiguration() { - super("flywayInitializer"); + super(FlywayMigrationInitializer.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 e237ed5ac2d..d2895c012f4 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 @@ -266,6 +266,22 @@ public class FlywayAutoConfigurationTests { }); } + @Test + public void customFlywayMigrationInitializerWithJpa() { + this.contextRunner + .withUserConfiguration(EmbeddedDataSourceConfiguration.class, + CustomFlywayMigrationInitializerWithJpaConfiguration.class) + .run((context) -> assertThat(context).hasNotFailed()); + } + + @Test + public void customFlywayMigrationInitializerWithJdbc() { + this.contextRunner + .withUserConfiguration(EmbeddedDataSourceConfiguration.class, + CustomFlywayMigrationInitializerWithJdbcConfiguration.class) + .run((context) -> assertThat(context).hasNotFailed()); + } + @Test public void customFlywayWithJpa() { this.contextRunner @@ -406,6 +422,25 @@ public class FlywayAutoConfigurationTests { } + @Configuration + protected static class CustomFlywayMigrationInitializerWithJpaConfiguration { + + @Bean + public FlywayMigrationInitializer customFlywayMigrationInitializer(Flyway flyway) { + return new FlywayMigrationInitializer(flyway); + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource) { + Map properties = new HashMap<>(); + properties.put("configured", "manually"); + properties.put("hibernate.transaction.jta.platform", NoJtaPlatform.INSTANCE); + return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), properties, null) + .dataSource(dataSource).build(); + } + + } + @Configuration protected static class CustomFlywayWithJpaConfiguration { @@ -457,6 +492,32 @@ public class FlywayAutoConfigurationTests { } + @Configuration + protected static class CustomFlywayMigrationInitializerWithJdbcConfiguration { + + private final DataSource dataSource; + + protected CustomFlywayMigrationInitializerWithJdbcConfiguration(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Bean + public FlywayMigrationInitializer customFlywayMigrationInitializer(Flyway flyway) { + return new FlywayMigrationInitializer(flyway); + } + + @Bean + public JdbcOperations jdbcOperations() { + return new JdbcTemplate(this.dataSource); + } + + @Bean + public NamedParameterJdbcOperations namedParameterJdbcOperations() { + return new NamedParameterJdbcTemplate(this.dataSource); + } + + } + @Component protected static class MockFlywayMigrationStrategy implements FlywayMigrationStrategy {