开发者社区> 问答> 正文

BeanCreationException:创建名称为“ flywayInitializer”的be

我正在尝试在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 : 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) )

从日志中我们可以看到已创建了容器映像,但是它无法迁移sql模式:

[...] 2019-10-10 10:36:18.768 INFO 49547 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 5.2.4 by Boxfuse 2019-10-10 10:36:18.777 INFO 49547 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2019-10-10 10:36:18.795 INFO 49547 --- [ main]  [postgres:9.6.12] : Creating container for image: postgres:9.6.12 2019-10-10 10:36:19.001 INFO 49547 --- [ main]  [postgres:9.6.12] : Starting container with ID: a32dd0850baf34770cce9bdc81918cd4db40502188b85dfaa90f74e2900f9fa7 2019-10-10 10:36:19.547 INFO 49547 --- [ main]  [postgres:9.6.12] : Container postgres:9.6.12 is starting: a32dd0850baf34770cce9bdc81918cd4db40502188b85dfaa90f74e2900f9fa7 2019-10-10 10:36:23.342 INFO 49547 --- [ main]  [postgres:9.6.12] : Container postgres:9.6.12 started 2019-10-10 10:36:23.426 INFO 49547 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2019-10-10 10:36:23.431 INFO 49547 --- [ main] o.f.c.internal.database.DatabaseFactory : Database: jdbc:postgresql://localhost:32834/test (PostgreSQL 9.6) 2019-10-10 10:36:23.488 INFO 49547 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 6 migrations (execution time 00:00.024s) 2019-10-10 10:36:23.501 INFO 49547 --- [ main] o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table: "public"."flyway_schema_history" 2019-10-10 10:36:23.519 INFO 49547 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "public": << Empty Schema >> 2019-10-10 10:36:23.520 INFO 49547 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema "public" to version 1 - initial user 2019-10-10 10:36:23.542 ERROR 49547 --- [ main] o.f.core.internal.command.DbMigrate : Migration of schema "public" to version 1 - initial user failed! Changes successfully rolled back. 2019-10-10 10:36:23.546 WARN 49547 --- [ main] o.s.w.c.s.GenericWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: 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脚本的一部分(app / src / main / resources / db / migration):

[...] constraint user_aud_pkey primary key (id, rev) );

CREATE TABLE revinfo ( rev INTEGER GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 ), revtstmp BIGINT, PRIMARY KEY (rev) );

CREATE SEQUENCE hibernate_sequence INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1; 这是“ application.properties”(app / test / java / resources):

spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver spring.datasource.url=jdbc:tc:postgresql://localhost:5433/test spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=validate spring.jackson.default-property-inclusion=NON_NULL

spring.flyway.baselineOnMigrate=true spring.flyway.check-location=true spring.flyway.locations=classpath:db/migration spring.flyway.schemas=public spring.flyway.enabled=true 同样在同一目录中,我有container-license-acceptance.txt文件。

在“ build.gradle”内部,添加了以下几行(app / build.gradle):

dependencies { [...] testImplementation "org.testcontainers:junit-jupiter:1.11.3" testImplementation "org.testcontainers:postgresql:1.11.3"

} 在BaseInitTest文件中,我有以下几行(app / test / java / com):

@Testcontainers @SpringBootTest public class BaseIntTest {

@Container
private static final PostgreSQLContainer<?> container = new PostgreSQLContainer<>();

[...]

$ docker --version

Docker版本19.03.1,内部版本74b1e89

$ uname -a

Darwin MacBook-Pro.local 18.6.0 Darwin Kernel Version 18.6.0: Thu Apr 25 23:16:27 PDT 2019; root:xnu-4903.261.4~2/RELEASE_X86_64 x86_64

我不明白,最初能通过相同的测试,但是将它们移至docker容器时会失败?

展开
收起
小六码奴 2019-10-10 18:57:32 2065 0
1 条回答
写回答
取消 提交回答
  • 看起来带有数据库的测试容器已经成功启动,所以没有问题,你得到的是一个空数据库。 然后你试着运行flyway,这失败了。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的本地环境中使用的数据库不同。

    无论如何,这与docker,spring或flyway无关,而与DB和迁移代码有关。

    在分辨率方面,我建议直接运行数据库的docker映像(不使用Java,testcontainers和flyway)。当它运行时,只需在pgadmin或其他程序中“手动”运行此迁移。你应该会看到相同的错误。

    2019-10-10 19:01:14
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载