有没有办法在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中执行相同的操作(或其他方式来获得相同的行为)。
答案 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)
你可以做两件事:
Flyway
个班级中创建自己的Configuration
个实例。如果你这样做,Spring Boot将不会创建他的实例。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();
}