2016-06-13 11 views
2

Flyway Java-based callbacksをSpringブートで実行する方法はありますか? 私は、各マイグレーションの後にいくつかのビュー定義を更新する既存のプロジェクトを変換しています。これは、いくつかの余分なロジックが必要なので、Javaによって行われます。私はそれがpl/pgsql(私たちはPostgresを使用しています)でも実行できることは知っていますが、すでにJavaでテストされています。SpringブートでFlyway Javaベースのコールバックを実行

Spring boot docsによると、コールバックスクリプトは移行と同じディレクトリに存在する必要がありますが、これはSQLベースのコールバックに対してのみ有効です。

このコードは、春ブーツなしで動作します:

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の移行が並んでいるので、ビルドパスはokです。 –

+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を参照)

あなたがすることができる2つのことがあります。

  1. はあなたのいずれかであなた自身のFlywayのインスタンスを作成します。 Configurationクラス。あなたがそうした場合に備えて、Spring Bootはインスタンスを作成しません。あなたが持つことができる
  2. あなたConfigurationクラスのいずれかでAutowire FlywayインスタンスとPostConstruct方法でsetCallbacksメソッドを呼び出します(しかし、移行を開始する前に、あなたがセッターを呼び出すことを確認するのが難しいかもしれません)
0

あなたはフライウェイの移行stragteyを上書きすることができます

@Component 
public class CallbackFlywayMigrationStrategy implements FlywayMigrationStrategy { 

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

} 
関連する問題