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

Testcontainers与R2DBC连接容器库时用户test认证失败求助

问题原因分析

  1. Testcontainers PostgreSQL容器认证信息不匹配
    你未显式指定容器的用户名和密码,Testcontainers会自动生成随机的认证凭据,而非你配置文件中硬编码的test/test。若初始化脚本使用的ConnectionFactory引用了硬编码的凭据,必然触发认证失败。

  2. 硬编码ConnectionFactory与容器配置冲突
    在AbstractPasswordTest.DetailsServiceConfiguration中手动创建的ConnectionFactory,硬编码了localhost、默认端口5432和test/test凭据,但Testcontainers容器使用的是随机映射端口和随机生成的认证信息,该Bean无法正确连接容器。如果PasswordDbInitializeConfiguration注入的是这个错误的Bean,就会导致脚本执行时认证失败。

  3. 配置覆盖可能未生效
    若R2DBCConfigurationPostgresqlPasswordDb未正确绑定r2dbc.chatdb的配置属性,生成的passwordConnectionFactory会使用配置文件中原始的test/test,而非容器的真实认证信息,引发错误。


解决办法

1. 显式指定容器的认证信息

修改PostgresqlContainer初始化代码,强制设置用户名和密码与配置文件一致:

private static final PostgreSQLContainer<?> postgresqlContainer = new PostgreSQLContainer<>(
        DockerImageName.parse(POSTGRESQL_IMAGE)
                .asCompatibleSubstituteFor("postgres")
)
.withDatabaseName("testdb")
.withUsername("test") // 显式指定用户名
.withPassword("test"); // 显式指定密码

2. 移除硬编码的ConnectionFactory Bean

删除DetailsServiceConfiguration中手动创建的ConnectionFactory,让Spring自动根据r2dbc.chatdb的配置生成正确的Bean:

public static class DetailsServiceConfiguration {
    // 移除手动创建的ConnectionFactory代码
    // Spring会自动基于r2dbc.chatdb的配置生成ConnectionFactory
}

若需自定义DatabaseClient,依赖Spring自动生成的ConnectionFactory即可:

public static class DetailsServiceConfiguration {
    @Bean
    public DatabaseClient userDbClient(ConnectionFactory connectionFactory) {
        return DatabaseClient.builder()
                .connectionFactory(connectionFactory)
                .namedParameters(true)
                .build();
    }
}

3. 确保配置绑定正确

检查R2DBCConfigurationPostgresqlPasswordDb,确保它正确绑定r2dbc.chatdb的配置:

@Configuration
@ConfigurationProperties(prefix = "r2dbc.chatdb")
public class R2DBCConfigurationPostgresqlPasswordDb {
    private String url;
    private String username;
    private String password;

    // 生成getter和setter

    @Bean(name = "passwordConnectionFactory")
    public ConnectionFactory passwordConnectionFactory() {
        return ConnectionFactories.get(
                ConnectionFactoryOptions.builder()
                        .from(ConnectionFactoryOptions.parse(url))
                        .option(USER, username)
                        .option(PASSWORD, password)
                        .build()
        );
    }
}

4. 修正R2DBC URL构造方式

在PostgresqlContainerInitializer中,直接使用容器提供的URL避免手动拼接出错:

// 替换手动拼接URL的代码
String r2dbcUrl = PostgreSQLR2DBCDatabaseContainer.getUrl(postgresqlContainer);
// 或者直接转换JDBC URL为R2DBC格式
String r2dbcUrl = postgresqlContainer.getJdbcUrl().replace("jdbc:", "r2dbc:pool:");

验证步骤

  1. 启动测试后查看Testcontainers日志,确认容器的用户名、密码、端口与配置一致。
  2. 检查Spring上下文Bean,确认passwordConnectionFactory使用的是容器的正确连接信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:24:56