使用Spring Boot运行基于Java的Flyway回调

时间:2016-06-13 00:44:51

标签: java spring spring-boot flyway

有没有办法在Spring启动时运行Flyway Java-based callbacks? 我转换现有项目,在每次迁移后更新一些视图定义,这是由Java完成的,因为它需要一些额外的逻辑。我知道它可以在pl / pgsql中完成(我们使用的是Postgres),但它已经完成并在Java中进行了测试。

Spring boot docs表示这是可能的,但是列出了回调脚本应该与迁移一样存在于同一目录中,这可能仅适用于基于SQL的回调。

此代码无需Spring Boot即可运行:

    Flyway flyway = new Flyway();
    flyway.setDataSource(this.getDataSource());
    flyway.setLocations("/db/migration");
    flyway.setCallbacks(new LogMaintenanceFlywayCallback());
    flyway.migrate();

我在/db/migration进行了多次迁移,每次迁移后我都需要执行回调。它适用于我当前的项目,我需要在Spring Boot中执行相同的操作(或其他方式来获得相同的行为)。

5 个答案:

答案 0 :(得分:3)

你可以有这样的配置,它可以工作:

@Configuration
public class FlywayFactory {

    @Bean
    public FlywayMigrationInitializer flywayInitializer(Flyway flyway) {
        flyway.setCallbacks(flywayCallback());
        return new FlywayMigrationInitializer(flyway);
    }

    @Bean
    public FlywayCallback flywayCallback() {
        return new LogMaintenanceFlywayCallback();
    }

}

答案 1 :(得分:1)

似乎没有可能在Spring Boot自动配置中设置回调(参见FlywayAutoConfiguration.java

你可以做两件事:

  1. 在您的Flyway个班级中创建自己的Configuration个实例。如果你这样做,Spring Boot将不会创建他的实例。
  2. Flyway个类中自动加载Configuration个实例,并使用setCallbacks方法调用PostConstruct方法(但确保您调用该方法可能会很棘手)迁移开始前的setter)

答案 2 :(得分:1)

由于setCallbacks(Callback... callbacks)的方法Flyway已被弃用,并将在Flyway 6.0中删除,因此您可以使用新的API和FlywayConfigurationCustomizer来设置基于Java的自定义回调。然后配置如下:

@Configuration
public class FlywayFactory {

    @Bean
    public FlywayConfigurationCustomizer flywayConfigurationCustomizer() {
        return configuration -> configuration.callbacks(new LogMaintenanceFlywayCallback());
    }
}

答案 3 :(得分:0)

您可以覆盖Flyway迁移stragtey

@Component
public class CallbackFlywayMigrationStrategy implements FlywayMigrationStrategy {

    @Override
    public void migrate(Flyway flyway) {
        flyway.setCallbacks(new LogMaintenanceFlywayCallback());
        flyway.migrate();
    }

}

答案 4 :(得分:0)

您可以按如下方式定义 org.flywaydb.core.api.callback.Callback 类型的 bean:

@Bean
public Callback logMaintenanceFlywayCallback() {
    return new LogMaintenanceFlywayCallback();
}