一、异常信息

今天早上启动项目,突然出现了如下异常,百度了一下没有合适的解决方案,决定从源码入手,看看能不能解决。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validationat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:917) ~[spring-context-5.3.4.jar:5.3.4]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582) ~[spring-context-5.3.4.jar:5.3.4]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) ~[spring-boot-2.4.3.jar:2.4.3]at com.zhx.realpro.CloudAlarmApplication.main(CloudAlarmApplication.java:33) ~[classes/:na]
Caused by: org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validationat org.flywaydb.core.Flyway$1.execute(Flyway.java:172) ~[flyway-core-7.1.1.jar:na]at org.flywaydb.core.Flyway$1.execute(Flyway.java:164) ~[flyway-core-7.1.1.jar:na]at org.flywaydb.core.Flyway.execute(Flyway.java:538) ~[flyway-core-7.1.1.jar:na]at org.flywaydb.core.Flyway.migrate(Flyway.java:164) ~[flyway-core-7.1.1.jar:na]at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ~[spring-beans-5.3.4.jar:5.3.4]... 19 common frames omitted

二、异常分析

根据错误信息,报的是FlywayValidateException异常,找到这个类打上断点
启动项目,查看调用链

找到了抛出异常的位置,在它前面的这行打上断点启动项目,因为是这个结果判断之后才抛出异常
ValidateResult validateResult = doValidate(database, migrationResolver, schemaHistory, schemas, callbackExecutor, true);
跟进这行去看

ValidateResult validateResult = new DbValidate(database, schemaHistory, schemas, migrationResolver, configuration, ignorePending, callbackExecutor).validate();


validate方法里面,在Callable的call方法做校验,这块感觉有点过度设计了,没找到另起线程的好处。

migrationInfoService的refresh方法sql文件加载进来了,这块就不看了。接着往下进入List<ValidateOutput> invalidMigrations = migrationInfoService.validate();

验证所有sql文件的checksum,如果sql文件是第一次执行,会产生一个checksum。之后改了sql文件的内容checksum的值就会发生改变,从而验证失败validateError就不会为空,那么invalidMigrations就会添加一条。进入migrationInfo.validate();

走到这块发现两个checksum不一致。跟进去resolvedMigration.checksumMatches

不一致就返回false

返回一个ErrorDetails,错误信息很详细,不过最终却没有输出,看看怎么回事,返回到DbValidate.DbValidate方法,call执行之后返回了result。

目前为止result里面还是有详细的错误信息的

校验失败的sql文件不为空就进入 validationError = new ErrorDetails(ErrorCode.VALIDATE_ERROR, "Migrations have failed validation");,这里的异常信息写死成“Migrations have failed validation”,导致更加详细的错误信息没有输出,记得老版本的flyway是有输出的。这样改了反而不直观。返回到Flyway.migrate

校验失败,抛出异常信息“ Migrations have failed validation”。

三、解决方案

前面已经讲到一般是由于sql文件在第一次执行之后发生了改变导致的。

  • 方案一:不要改动sql文件,增加新的sql文件去修改表
  • 方案二:直接将数据库表flyway_schema_history中的checksum改成新生成的checksum,但是不建议直接改库。估计也是这个原因,新版的flyway就不把新产生的checksum打印出来了

Flyway报错源码分析——Validate failed: Migrations have failed validation相关推荐

  1. axi dma 常见的中断报错源码

    // axi dma 中断判断 常见错误;这个对于排查错误很有帮助if (status & XILINX_DMA_DMASR_ERR_IRQ) { /** An error occurred. ...

  2. 【报错】flink源码分析: has no more allocated slots与思考

    文章目录 一. 任务描述与一句话 1. 任务描述 2. 一句话 二. 日志分析 1. 申请一个task manager 2. 大概3分钟后运行这个tm时,报资源找不到 三. 源码分析与报错机制定位 1 ...

  3. 微信支付生成签名和验签SDK源码分析

    目录 一.签名分析 1.1 流程分析 1.构造签名串 2.计算签名值 3.设置请求头 二.源码级别分析 二.获取平台证书分析 三.验签分析 3.1 验签使用场景: 3.2 验证流程: 1.获取微信平台 ...

  4. PPP协议工作流程,结合ppp-2.4.9 源码分析

    ppp-2.4.9 源码分析 文章目录 ppp-2.4.9 源码分析 PPP协议工作流程 ppp-2.4.9 源码分析 全局变量和结构体说明 第一阶段 初始化 第二阶段 开始链接 第三阶段 建立PPP ...

  5. 【spring源码】源码分析

    [spring源码]源码分析 (一)mac版idea引入spring源码 (二)spring的学习流程 (三)spring源码分析 [1]refresh()方法概览(AbstractApplicati ...

  6. Hhadoop-2.7.0中HDFS写文件源码分析(二):客户端实现(1)

    一.综述 HDFS写文件是整个Hadoop中最为复杂的流程之一,它涉及到HDFS中NameNode.DataNode.DFSClient等众多角色的分工与合作. 首先上一段代码,客户端是如何写文件的: ...

  7. kazoo源码分析:服务器交互的实现细节

    kazoo源码分析 kazoo-2.6.1 kazoo客户端与服务器概述 上文start概述中,只是简单的概述了kazoo客户端初始化之后,调用了start方法,本文继续详细的了解相关的细节. kaz ...

  8. kazoo源码分析:Zookeeper客户端start概述

    kazoo源码分析 kazoo-2.6.1 kazoo客户端 kazoo是一个由Python编写的zookeeper客户端,实现了zookeeper协议,从而提供了Python与zookeeper服务 ...

  9. Nginx源码分析:master/worker工作流程概述

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> Nginx的master与worker工作模式 在生成环境中的Nginx启动模式基本都是以m ...

最新文章

  1. 使用多尺度空间注意力的语义分割方法
  2. linux grep 点号的匹配
  3. dubbo控制中心部署,权重配置,以及管控台中各个配置的简单查看
  4. write up社工进阶
  5. php excel 下拉菜单,使用 PHPExcel 遇到的一个问题:下拉列表的数据来源过长时,显示了别的正常的下拉列表的数据来源...
  6. 发布的站点自定义端口打不开解决方法
  7. geohash java 距离排序_APP筛选附近的人并排序(geohash算法)
  8. 全国计算机等级考试三级数据库技术考试大纲(2018 年版)
  9. python3视频教程哪个好_2020年5个经典python编程入门视频教程推荐学习
  10. python调用crt自动登录_secureCRT自动登录脚本(python)
  11. android/ios播放器ijkplayer Ubuntu编译(支持HTTPS、ffmpeg高版本)
  12. java 实现短信验证码
  13. Ir_scheduler模块
  14. 怎么压缩word文档大小?
  15. 微信支付(小程序微信支付)
  16. 扫雷代码java_JAVA实现扫雷游戏
  17. Matlab abs防抱死系统,防抱死制动系统建模
  18. 综述 | 图像计算传感器
  19. c语言程序的上标怎么打出来,c上标2下标5怎么算
  20. Altium Designer:从零开始的电路板制作攻略

热门文章

  1. 谷歌通过Chrome简化登录安卓密码支持
  2. centos7+TP5.1+selenium+chrome抓取搜狗微信推文
  3. AI核心代码,保守估值一个亿(python版)
  4. burnintest linux,BURNINTEST-FOR-LINUX-CLI
  5. 微波炉定时c语言程序,微波炉定时器—微波炉定时器与微波炉原理
  6. java创建QRCode二维码的三种方式
  7. 斯坦李去世、霍金去世、金庸去世、李咏去世,2018年有点悲壮!
  8. javafx制作2.5d的rpg游戏
  9. 树莓派(网络摄像头)4G网络720p高清图传(python3.7+SpringBoot-JavaNetty+Android-Mediacodec)
  10. Cisco认证考试教材题库合集(30套)