2016-06-13 23 views
2

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

Spring boot docs说这是可能的,但它列出回调脚本应该居住在相同的目录作为迁移,也许这只适用于基于SQL的回调。

此代码的工作没有Spring启动:

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

我有几个/db/migration迁移和每一个后,我需要执行我的回调。它在我当前的项目中起作用,并且我需要在Spring Boot中执行相同的操作(或另一种方式来获得相同的行为)。

+0

它的工作原理。您需要将Java类放入'db.migrations'包中。 –

+0

他们是否必须在标准中命名?我创建了一个'SomeMaintenanceFlywayCallback',实现了接口'FlywayCallback'和'afterEachMigrate'方法没有被调用。我曾尝试将该类重命名为'AfterEachMigrate',但没有成功。它在'db.migrations'包中,并行执行Java迁移,因此构建路径正常。 –

+0

SQL迁移应该在'src/main/resources/db/migration'中。 Java迁移应该在'src/main/java/db/migration'中。每个文件通常以'Vxxx__some-text-here.sql'或Vxxx__MyJavaClass.java'开头。 –

回答

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

似乎有没有可能设定在春节开机自动配置的回调(见FlywayAutoConfiguration.java

有两件事情可以做:

  1. 在一个创建自己的Flyway比如你Configuration类。如果你这样做,Spring Boot不会创建他的实例。
  2. 自动装配在Configuration类之一的Flyway实例,并调用在PostConstruct方法setCallbacks方法(但它可能会非常棘手,以确保您拨打的setter迁移开始之前)
0

您可以覆盖迁飞迁移stragtey

@Component 
public class CallbackFlywayMigrationStrategy implements FlywayMigrationStrategy { 

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

} 
相关问题