SpringBoot项目集成Flyway配置执行顺序问题解决方法 您所在的位置:网站首页 flyway_schema_history创建多个 SpringBoot项目集成Flyway配置执行顺序问题解决方法

SpringBoot项目集成Flyway配置执行顺序问题解决方法

2024-07-09 18:52| 来源: 网络整理| 查看: 265

      问题描述 :程序里把大部分配置都放到数据库里了,也就是说程序启动有些配置要先去查数据库,拿到数据后,再继续配置相关的服务,比如 WebMvcConfigurerAdapter  资源路径配置等初始化工作,这时候就出问题了,flyway还没有执行,数据库里还没有数据,就开始配置其它的一些服务了,到数据库里查不到数据,配置自然就报错了

   

    问题解决思路:自然是控制flyway的执行顺序,让flyway执行在依赖查询数据库配置的服务之前。 问题是springboot集成flyway是自动配置的,也就是说我们要想控制flyway的配置顺序,就得自己重写flyway的配置。

    

   问题解决方案:

       1、重写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) { logger.error("Flyway配置第一次加载出错",e); try { flyway.repair(); logger.info("Flyway配置修复成功"); flyway.migrate(); logger.info("Flyway配置重新加载成功"); }catch (Exception e1){ logger.error("Flyway配置第二次加载出错",e1); throw e1; } } } }

           2、将flyway配置从springboot排除,避免springboot自动配置

@SpringBootApplication(exclude = {FlywayAutoConfiguration.class}) @EnableTransactionManagement public class SiteServerApplication { public static void main(String[] args) { SpringApplication.run(SiteServerApplication.class, args); } }

 

     3、使用Spring @DependsOn控制bean加载顺序

@Configuration @DependsOn("flywayConfig") public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter

至此问题解决。

总结:很多场景beanA依赖beanB,都可以通过@DependsOn来告诉springbean容器beanB先执行

 

参考资料:https://blog.csdn.net/neweastsun/article/details/78775371

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有