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

AWS Java SDK V2与aws-secretsmanager-jdbc兼容性问题求助

问题解决:AWS SDK V2 与 aws-secretsmanager-jdbc 兼容性导致 S3Client 阻塞

问题原因

aws-secretsmanager-jdbc:2.0.0 默认依赖 AWS SDK V1(com.amazonaws 开头的组件),而你的应用使用的是 AWS SDK V2(software.amazon.awssdk 开头)。两者在核心组件(如 HttpClient、凭证提供者、区域处理类)上存在类路径冲突,导致 S3Client 构建时线程无限挂起。

解决方案

方案1:排除JDBC驱动中的SDK V1依赖,强制使用SDK V2

修改 pom.xml 中 aws-secretsmanager-jdbc 的依赖配置,排除所有SDK V1相关组件,确保应用只加载SDK V2的类:

<dependency>
    <groupId>com.amazonaws.secretsmanager</groupId>
    <artifactId>aws-secretsmanager-jdbc</artifactId>
    <version>2.0.0</version>
    <exclusions>
        <!-- 排除所有AWS SDK V1核心依赖 -->
        <exclusion>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-secretsmanager</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.amazonaws</groupId>
            <artifactId>jmespath-java</artifactId>
        </exclusion>
    </exclusions>
</dependency>

同时确保你的SDK V2 secretsmanager 依赖已正确引入(你当前的配置已包含):

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>secretsmanager</artifactId>
    <version>2.21.21</version>
</dependency>

方案2:显式指定S3Client的HttpClient实现

冲突可能源于HttpClient的自动加载异常,显式指定SDK V2的HttpClient实现可以避免这个问题:

import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;

// 构建S3Client时显式指定HttpClient
S3Client client = S3Client.builder()
        .region(Region.of(this.regionName))
        .forcePathStyle(true)
        .httpClient(UrlConnectionHttpClient.create()) // 使用URLConnection实现,无额外依赖
        .build();

如果需要更高性能,也可以使用Netty HttpClient(需额外引入依赖):

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>netty-nio-client</artifactId>
    <version>2.21.21</version>
</dependency>

然后修改构建代码:

import software.amazon.awssdk.http.nio.netty.NettyNioHttpClient;

S3Client client = S3Client.builder()
        .region(Region.of(this.regionName))
        .forcePathStyle(true)
        .httpClient(NettyNioHttpClient.create())
        .build();

方案3:升级JDBC驱动到支持SDK V2的版本

检查 aws-secretsmanager-jdbc 的最新版本(如3.x及以上),部分新版本已支持AWS SDK V2,直接升级依赖即可:

<dependency>
    <groupId>com.amazonaws.secretsmanager</groupId>
    <artifactId>aws-secretsmanager-jdbc</artifactId>
    <version>3.0.1</version> <!-- 确认最新兼容版本 -->
</dependency>

方案4:绕开JDBC驱动,手动用SDK V2获取凭证

如果以上方案都不生效,可以直接使用SDK V2的 SecretsManagerClient 获取数据库凭证,然后配置普通的MySQL数据源:

  1. 获取凭证:
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

// 构建SecretsManagerClient
SecretsManagerClient secretsClient = SecretsManagerClient.builder()
        .region(Region.of(this.regionName))
        .build();

// 获取凭证
GetSecretValueRequest request = GetSecretValueRequest.builder()
        .secretId("db/secret/test")
        .build();
GetSecretValueResponse response = secretsClient.getSecretValue(request);

// 解析JSON格式的凭证
ObjectMapper mapper = new ObjectMapper();
JsonNode secretNode = mapper.readTree(response.secretString());
String dbUser = secretNode.get("username").asText();
String dbPass = secretNode.get("password").asText();
  1. 配置普通MySQL数据源:
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://db_url:3306/db
    username: ${dbUser}
    password: ${dbPass}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:31:07