无法运行DynamoDB相关类的JUnit测试,提示类路径存在多个HTTP实现
报错原因与解决方案
错误根本原因
这个报错和你声明多少次client builder没有关系,是AWS SDK for Java 2.x的依赖冲突问题:SDK默认会自动探测classpath下的HTTP客户端实现,当同时存在多个符合要求的实现(比如url-connection-client、apache-client、netty-nio-client中的2个及以上)时,就会抛出该异常。通常是不同AWS服务依赖默认绑定了不同HTTP客户端导致的冲突。
可行解决方案
方案1:显式指定HTTP客户端实现(最稳定)
在构造DynamoDbClient时直接指定要使用的HTTP客户端,绕过SDK的自动探测逻辑:
- 首先在pom.xml中确保你要使用的HTTP客户端依赖存在,轻量化同步场景推荐使用
url-connection-client:
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>url-connection-client</artifactId> <version>你的AWS SDK 2.x版本号</version> </dependency>
- 修改客户端构造代码,增加httpClient配置:
DynamoDbClient client = DynamoDbClient.builder() .region(Region.EU_WEST_1) .httpClient(UrlConnectionHttpClient.create()) // 新增这行显式指定 .build();
方案2:排除多余的HTTP客户端依赖
检查pom.xml中所有AWS相关依赖,将不需要的HTTP客户端通过exclusions排除,比如要排除apache-client:
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb</artifactId> <version>你的AWS SDK 2.x版本号</version> <exclusions> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </exclusion> </exclusions> </dependency>
方案3:通过JVM参数指定默认实现
如果不想修改代码,可以在测试运行时增加JVM系统参数指定HTTP客户端实现,在maven的surefire插件中添加如下配置即可:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>你的插件版本号</version> <configuration> <systemPropertyVariables> <software.amazon.awssdk.http.service.impl>software.amazon.awssdk.http.urlconnection.UrlConnectionSdkHttpService</software.amazon.awssdk.http.service.impl> </systemPropertyVariables> </configuration> </plugin>
额外代码优化建议
你代码中字符串比较使用了==,这会比较对象引用而非字符串内容,可能导致匹配不到指定列,建议修改为:
if (key.equals(tableColumn)) { ListValues.add(item.get(key).s()) ; }
内容的提问来源于stack exchange,提问作者TheWalkingMalteser
相关产品推荐
相关产品推荐

