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

      问题描述 :程序里把大部分配置都放到数据库里了,也就是说程序启动有些配置要先去查数据库,拿到数据后,再继续配置相关的服务,比如 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

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值