問題描述 :程序里把大部分配置都放到數據庫里了,也就是說程序啟動有些配置要先去查數據庫,拿到數據后,再繼續配置相關的服務,比如 WebMvcConfigurerAdapter 資源路徑配置等初始化工作,這時候就出問題了,flyway還沒有執行,數據庫里還沒有數據,就開始配置其它的一些服務了,到數據庫里查不到數據,配置自然就報錯了
問題解決思路:自然是控制flyway的執行順序,讓flyway執行在依賴查詢數據庫配置的服務之前。 問題是springboot集成flyway是自動配置的,也就是說我們要想控制flyway的配置順序,就得自己重寫flyway的配置。
import javax.annotation.PostConstruct; import javax.sql.DataSource; import org.flywaydb.core.Flyway; import org.flywaydb.core.api.FlywayException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @Configuration public class FlywayConfig { @Autowired private DataSource dataSource; private Logger logger = LoggerFactory.getLogger(this.getClass()); @PostConstruct public void migrate() { Flyway flyway = new Flyway(); flyway.setDataSource(dataSource); // 設置flyway掃描sql升級腳本、java升級腳本的目錄路徑或包路徑(表示是src/main/resources/flyway下面,前綴默認為src/main/resources,因為這個路徑默認在classpath下面) flyway.setLocations("db/migration"); // 設置sql腳本文件的編碼 flyway.setEncoding("UTF-8"); flyway.setOutOfOrder(true); try { flyway.migrate(); } catch (FlywayException e) { flyway.repair(); logger.error("Flyway配置加載出錯",e); } } }
2、將flyway配置從springboot排除,避免springboot自動配置
@SpringBootApplication(exclude = {FlywayAutoConfiguration.class}) @EnableTransactionManagement public class SiteServerApplication { public static void main(String[] args) { SpringApplication.run(SiteServerApplication.class, args); } }