为了账号安全,请及时绑定邮箱和手机立即绑定

创建名为“flywayInitializer”的 bean 时出错

创建名为“flywayInitializer”的 bean 时出错

胡子哥哥 2023-10-12 20:41:58
我正在尝试在 Docker 容器中运行我的项目测试。所有测试在本地运行时都运行良好。当我尝试将测试移动到 docker 容器时,错误开始发生。这是错误消息:java.lang.IllegalStateException: Failed to load ApplicationContext[...]Caused by: 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.internal.command.DbMigrate$FlywayMigrateException: Migration V1__initial_user.sql failed-------------------------------------SQL State  : 42601Error Code : 0Message    : ERROR: syntax error at or near "GENERATED"  Position: 45Location   : db/migration/V1__initial_user.sql (/Users/villemossip/Desktop/GRP/GRP-SAS/application/build/resources/main/db/migration/V1__initial_user.sql)Line       : 36Statement  : CREATE TABLE revinfo(    rev      INTEGER GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 ),    revtstmp BIGINT,    PRIMARY KEY (rev))
查看完整描述

3 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

看起来带有数据库的测试容器已成功启动,因此没有问题,您将得到一个空数据库。


然后你尝试运行飞行路线,但失败了。Spring Boot中的Flyway在Spring应用程序上下文初始化期间工作,因此实际迁移在应用程序上下文初始化时运行,因此迁移失败看起来像Spring失败。


但是,记录了原因:迁移文件包含无效内容:


Migration V1__initial_user.sql failed

-------------------------------------

SQL State  : 42601

Error Code : 0

Message    : ERROR: syntax error at or near "GENERATED"

 Position: 45

Location   : db/migration/V1__initial_user.sql (/Users/villemossip/Desktop/GRP/GRP- 

SAS/application/build/resources/main/db/migration/V1__initial_user.sql)

Line       : 36

Statement  : CREATE TABLE revinfo

(

   rev      INTEGER GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 ),

   revtstmp BIGINT,

   PRIMARY KEY (rev)

)

这GENERATED BY是不受支持的。


为什么?您的 docker 映像可能包含不支持此语法的 RDBMS 版本。所以它和你在没有docker的本地环境中使用的DB不同。


无论如何,这不是关于 docker、spring 或 Flyway 的问题,而是关于数据库和迁移代码的问题。


在分辨率方面,我建议直接运行DB的docker镜像(不带java、testcontainers和flyway)。当它运行时,只需在 pgadmin 或其他东西中“手动”运行此迁移即可。您预计会看到相同的错误。


查看完整回答
反对 回复 2023-10-12
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

就我而言,我在 application.properties 文件中添加了

spring.flyway.baselineOnMigrate = true

我还必须从版本 1.1 而不是 1 开始,否则 Flyway 会抛出错误(flyway 8.0.5)


查看完整回答
反对 回复 2023-10-12
?
慕森卡

TA贡献1806条经验 获得超8个赞

我发现问题出在 Postgres 版本上。由于某种原因,默认情况下,docker 镜像是使用旧版本 9.6.12 创建的,但 SQL 脚本GENERATED BY DEFAULT已添加到版本 10 的 Postgres 中。


解决方案1(将sql脚本更新到旧版本):


CREATE TABLE revinfo

(

    rev      INTEGER PRIMARY KEY NOT NULL,

    revtstmp BIGINT

);

解决方案2: 通过在项目中创建CustomPostgreSQLContainer文件将docker镜像版本更改为11.2。


import org.testcontainers.containers.PostgreSQLContainer;


public class CustomPostgreSQLContainer extends PostgreSQLContainer<CustomPostgreSQLContainer> {

    private static final String IMAGE_VERSION = "postgres:11.2";

    private static CustomPostgreSQLContainer container;

    CustomPostgreSQLContainer() {

        super(IMAGE_VERSION);

    }

    public static CustomPostgreSQLContainer getInstance() {

        if (container == null) {

            container = new CustomPostgreSQLContainer();

        }

        return container;

    }

    @Override

    public void start() {

        super.start();

        System.setProperty("spring.datasource.url", container.getJdbcUrl());

        System.setProperty("spring.datasource.username", container.getUsername());

        System.setProperty("spring.datasource.password", container.getPassword());

    }

    @Override

    public void stop() {

        //do nothing, JVM handles shut down

    }

}

并更新 BaseIntTest 文件:


@Testcontainers

@SpringBootTest

public class BaseIntTest {


    @Container

    private static final PostgreSQLContainer<?> container = CustomPostgreSQLContainer.getInstance();

最后从测试 application.properties 文件中删除两行:


spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver

spring.datasource.url=jdbc:tc:postgresql://localhost:5433/test


查看完整回答
反对 回复 2023-10-12
  • 3 回答
  • 0 关注
  • 275 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信