Micronaut测试环境Flyway不支持PostgreSQL 17.2问题求助
问题:Micronaut Test Resources + Flyway 出现PostgreSQL版本不支持错误
配置信息
插件配置
plugins { id("com.github.johnrengelman.shadow") version "8.1.1" id("io.micronaut.application") version "4.4.4" id("io.micronaut.test-resources") version "4.4.4" <-- 新增插件 id("io.micronaut.aot") version "4.4.4" id("org.flywaydb.flyway") version "11.0.1" }
依赖配置
dependencies { annotationProcessor("org.projectlombok:lombok") annotationProcessor("io.micronaut:micronaut-http-validation") annotationProcessor("io.micronaut.data:micronaut-data-processor") implementation("io.micronaut:micronaut-jackson-databind") implementation("school.staff:common:0.0.1") implementation("io.micronaut.data:micronaut-data-jdbc") implementation("io.micronaut:micronaut-management") implementation("org.flywaydb:flyway-core:11.1.0") implementation("io.micronaut.flyway:micronaut-flyway") compileOnly("org.projectlombok:lombok") compileOnly("io.micronaut:micronaut-http-client") compileOnly("jakarta.persistence:jakarta.persistence-api") runtimeOnly("ch.qos.logback:logback-classic") runtimeOnly("org.postgresql:postgresql") runtimeOnly("io.micronaut.sql:micronaut-jdbc-hikari") testImplementation("io.micronaut:micronaut-http-client") testImplementation("net.datafaker:datafaker:2.4.2") }
测试配置类
public abstract class TestContainerConfig implements TestPropertyProvider { @Override public @NonNull Map<String, String> getProperties() { return Map.of( "datasources.default.dialect", "POSTGRES", "datasources.default.db-type", "postgres", "datasources.default.driver-class-name", "org.postgresql.Driver" ); } }
测试基类与测试用例
public class BaseFixture extends TestContainerConfig{ protected final TestDataGenerator testDataGenerator = new TestDataGenerator(); }
测试用例继承基类:
@TestInstance(TestInstance.Lifecycle.PER_CLASS) @MicronautTest public final class TagServiceTest extends BaseFixture { @Inject private IServiceAction<TagRequest, TagResponse> tagService; @Test @DisplayName("Should create a tag with valid name") void shouldCreateATagWithValidName() { // Given TagRequest requestModel = testDataGenerator.generateRecord(TagRequest.class); // When var result = this.tagService.post(requestModel); //Then assertNotNull(result); } }
测试环境配置
# 手动运行迁移 flyway.datasources.default.enabled=true
错误日志
19:16:41.161 [Test worker] INFO i.m.c.DefaultApplicationContext$RuntimeConfiguredEnvironment - Established active environments: [test] 19:16:42.457 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... 19:16:42.560 [Test worker] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@77b919a3 19:16:42.561 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. 19:16:42.608 [Test worker] INFO i.m.flyway.AbstractFlywayMigration - Running migrations for database with qualifier [default] Bean definition [javax.sql.DataSource] could not be loaded: Unsupported Database: PostgreSQL 17.2 io.micronaut.context.exceptions.BeanInstantiationException: Bean definition [javax.sql.DataSource] could not be loaded: Unsupported Database: PostgreSQL 17.2 at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:2000) at io.micronaut.context.DefaultApplicationContext.initializeContext(DefaultApplicationContext.java:314) at io.micronaut.context.DefaultBeanContext.configureAndStartContext(DefaultBeanContext.java:3318) at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:345) at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:216) at io.micronaut.test.extensions.AbstractMicronautExtension.startApplicationContext(AbstractMicronautExtension.java:507) at io.micronaut.test.extensions.AbstractMicronautExtension.beforeClass(AbstractMicronautExtension.java:346) at io.micronaut.test.extensions.junit5.MicronautJunit5Extension.beforeAll(MicronautJunit5Extension.java:84) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: org.flywaydb.core.api.FlywayException: Unsupported Database: PostgreSQL 17.2 at org.flywaydb.core.internal.database.DatabaseTypeRegister.lambda$getDatabaseTypeForConnection$7(DatabaseTypeRegister.java:131) at java.base/java.util.Optional.orElseThrow(Optional.java:403) at org.flywaydb.core.internal.database.DatabaseTypeRegister.getDatabaseTypeForConnection(DatabaseTypeRegister.java:131) at org.flywaydb.core.internal.jdbc.JdbcConnectionFactory.<init>(JdbcConnectionFactory.java:77) at org.flywaydb.core.FlywayExecutor.execute(FlywayExecutor.java:137) at org.flywaydb.core.Flyway.migrate(Flyway.java:178) at io.micronaut.flyway.AbstractFlywayMigration.runFlyway(AbstractFlywayMigration.java:110) at io.micronaut.flyway.AbstractFlywayMigration.forceRun(AbstractFlywayMigration.java:93) at io.micronaut.flyway.AbstractFlywayMigration.run(AbstractFlywayMigration.java:66) at io.micronaut.flyway.DataSourceMigrationRunner.lambda$onCreated$1(DataSourceMigrationRunner.java:65) at java.base/java.util.Optional.ifPresent(Optional.java:178) at io.micronaut.flyway.DataSourceMigrationRunner.onCreated(DataSourceMigrationRunner.java:63) at io.micronaut.flyway.DataSourceMigrationRunner.onCreated(DataSourceMigrationRunner.java:39) at io.micronaut.context.DefaultBeanContext.triggerBeanCreatedEventListener(DefaultBeanContext.java:2387) at io.micronaut.context.DefaultBeanContext.postBeanCreated(DefaultBeanContext.java:2364) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2308) at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2316) at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3127) at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80) at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:3029) at io.micronaut.context.DefaultBeanContext.initializeEagerBean(DefaultBeanContext.java:2693) at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1994) ... 8 more
已尝试操作
- 在测试配置中指定PostgreSQL容器镜像版本:
test-resources.containers.postgres.image-name=postgres:10.3,但问题未解决
解决方案
原因分析
错误核心是Flyway版本与PostgreSQL版本不兼容:当前使用的Flyway 11.0.1/11.1.0版本不支持PostgreSQL 17.x,而Micronaut Test Resources默认会拉取最新的PostgreSQL镜像(17.2),即使手动指定旧版本镜像,可能因为配置未生效或依赖版本不一致导致问题。
具体解决步骤
方案1:升级Flyway到支持PostgreSQL 17的版本
Flyway从11.5.0版本开始正式支持PostgreSQL 17。需要统一升级Flyway插件和依赖版本:
- 修改插件配置中的Flyway版本:
id("org.flywaydb.flyway") version "11.5.0"
- 修改依赖中的flyway-core版本:
implementation("org.flywaydb:flyway-core:11.5.0")
方案2:指定Test Resources使用Flyway支持的PostgreSQL版本
如果不想升级Flyway,可指定PostgreSQL版本为当前Flyway支持的范围(Flyway 11.x支持PostgreSQL 9.5-16):
- 在
src/test/resources/application-test.properties中添加:
test-resources.containers.postgres.image-name=postgres:16
- 确保测试类激活
test环境(@MicronautTest默认已激活),避免配置被覆盖。
方案3:统一Flyway插件与依赖版本
当前Flyway插件版本是11.0.1,而flyway-core依赖是11.1.0,版本不一致可能引发潜在问题,统一版本号可避免此类情况。
内容的提问来源于stack exchange,提问作者San Jaisy
相关产品推荐
相关产品推荐

