Flyway:如何在不获取“ FlywayException:验证失败”的情况下替换已弃用的SpringJdbcMigration?

时间:2018-12-11 10:44:33

标签: spring-boot flyway

将springboot 2.0.3升级到2.1.1还带来了一个新的flyway版本:5.2.3而不是5.0.7。

在5.2.3中,不推荐使用SpringJdbcMigration并将其在flyway 6中删除。我主要使用sql脚本,但是我在项目中也有一个Java迁移类(有4个sql迁移,最后一个4.2迁移是Java迁移-更改旧数据只是一些快速而肮脏的技巧,我不再需要它。

所以我改变了那个班级:

class V4_2__Update_foo implements SpringJdbcMigration {
    public void migrate(JdbcTemplate jdbcTemplate) throws Exception {
    ...
    }
}

class V4_2__Update_foo extends BaseJavaMigration {
    public void migrate(Context context) throws Exception {
    JdbcTemplate jdbcTemplate = 
      new JdbcTemplate(new SingleConnectionDataSource(context.getConnection(), true));
    ......
    }
}

这是唯一的更改,其他所有内容都相同。结果是

Application run failed
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.FlywayException:
Validate failed: Migration type mismatch for migration version 4.2
....
Caused by: org.flywaydb.core.api.FlywayException:
Validate failed: Migration type mismatch for migration version 4.2
-> Applied to database : SPRING_JDBC
-> Resolved locally    : JDBC
at org.flywaydb.core.Flyway.doValidate(Flyway.java:1479)

我不想永久禁用验证,但是我也不知道如何解决此问题。我尝试使用Google搜索,但未发现与“类型不匹配”有关的任何内容。 在我的开发人员机器上,我尝试了“飞车维修”,但只说了

Repair of failed migration in Schema History table "PUBLIC"."schema_version" not necessary. No failed migration detected.
Successfully repaired schema history table "PUBLIC"."schema_version"

运行修复后,迁移4.2的类型仍为“ SPRING_JDBC”。 后来我完全删除了Java类,这使我得到

的警告。
Schema "PUBLIC" has a version (4.2) that is newer than the latest available migration (4) !

,但至少应用程序再次运行。不过,我在生产中确实不太满意。还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

那绝对是一个错误。不幸的是,这不会在5.2.x中修复。 Flyway 6.0(将于2019年第一季度到期)将自动更正您的架构历史记录表并进行修复。

或者,如果您真的不想等待,可以手动在架构历史记录表上查找路径,以使此消息消失。