You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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插件和依赖版本:

  1. 修改插件配置中的Flyway版本:
id("org.flywaydb.flyway") version "11.5.0"
  1. 修改依赖中的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):

  1. 在src/test/resources/application-test.properties中添加:
test-resources.containers.postgres.image-name=postgres:16
  1. 确保测试类激活test环境(@MicronautTest默认已激活),避免配置被覆盖。

方案3:统一Flyway插件与依赖版本

当前Flyway插件版本是11.0.1,而flyway-core依赖是11.1.0,版本不一致可能引发潜在问题,统一版本号可避免此类情况。

内容的提问来源于stack exchange,提问作者San Jaisy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:10:53