2016-06-13 138 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(); 
    } 

} 
相關問題