springBoot 项目集成Mybatis,原有flyway不执行,项目启动报错;Flyway和MybatisPlus执行顺序

司空高义
2023-12-01

背景:

项目从jpa过渡到mybatis,代码整合之后,使用新的数据库连接,项目启动报错,未看到flyway等打印的日志信息,且数据库未生成数据。

报错大概为找不到对应表

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat

### Cause: org.postgresql.util.PSQLException: ERROR: relation "postgres_schemename.xxxxx_configuration_tablename" does not exist

究其原因,应该是flyway还未启动成功,初始化代码时,用到了对应的表或对应表数据,但此时flyway还未执行,所以抛出异常,项目启动报错。

解决方案:

查看日志是哪个类抛出的错误信息,在该类上加@DependsOn("flywayConfig")注解,
该注解含义是在flywayConfig类执行完后再加载该类,这样flyway执行完,有表有数据,就能正常加载到,启动也正常。

下附FlywayConfig.java代码

@Configuration
public class FlywayConfig {

    private final DataSource dataSource;

    public FlywayConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @PostConstruct
    public void migrate() {
        Flyway flyway = Flyway.configure()
            .dataSource(dataSource)
            .locations("db/migration")
            .baselineOnMigrate(true)
            .load();
        flyway.migrate();
    }
}

写的较为简单,其实就是Flyway和MybatisPlus执行顺序先后的问题。
针对该问题也可参考:https://tomoya92.github.io/2019/01/03/spring-boot-flyway-mybatis-plus/

 类似资料: