使用AWS SDK for Java调用DynamoDB查询时出现重复ExecutionAttributes错误
问题场景
开发Spring Boot微服务查询DynamoDB表时,AWS CLI可正常操作表数据,但应用运行时抛出以下异常:
Handler dispatch failed; nested exception is java.lang.ExceptionInInitializerError
根因:java.lang.IllegalArgumentException: No duplicate ExecutionAttribute names allowed but both ExecutionAttributes 528c2979 and 6970b040 have the same name: DualstackEndpointsEnabled. ExecutionAttributes should be referenced from a shared static constant to protect against erroneous or unexpected collisions.
已尝试切换IDE(IntelliJ/VSCode)、使用Maven命令行启动、卸载DynamoDB插件、终止443端口AWS进程,均未解决。
核心调用代码:
public PageIterable<DynamoOrder> getOrdersByChannel(String channelName) { DynamoDbTable<DynamoOrder> orderTable = getTable(); AttributeValue channelNameAttribute = AttributeValue.builder().s(channelName).build(); Expression expression = Expression.builder().expression("marketplaceChannelName = :v_marketplaceChannelName") .putExpressionValue(":v_marketplaceChannelName", channelNameAttribute).build(); return orderTable.scan(ScanEnhancedRequest.builder().filterExpression(expression).build()); }
问题分析
这个异常本质是AWS SDK v2的ExecutionAttribute命名冲突,通常由以下原因导致:
- 项目依赖中存在多个版本的AWS SDK核心包(sdk-core),不同版本的类生成了同名的
DualstackEndpointsEnabled属性实例。 - 类加载器重复加载了
ExecutionAttribute类,导致静态常量实例重复。
解决方案
1. 统一AWS SDK依赖版本
- 执行Maven命令查看依赖树,定位冲突的
sdk-core版本:mvn dependency:tree | grep "software.amazon.awssdk:sdk-core" - 在
pom.xml的<dependencyManagement>中导入AWS SDK BOM,强制统一所有相关依赖版本:<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.20.150</version> <!-- 替换为稳定兼容版本 --> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> - 检查第三方依赖,排除其中引入的旧版本AWS SDK模块。
2. 清理构建与IDE缓存
- 清理Maven缓存并重新构建:
mvn clean install -U - 清理IDE缓存(以IntelliJ为例):
File → Invalidate Caches...,勾选Clear file system cache and local history后重启IDE。
3. 规范DynamoDB客户端配置
确保DynamoDB客户端和表实例以单例方式创建,避免重复实例化引发类加载问题:
@Configuration public class DynamoDbConfig { @Bean public DynamoDbEnhancedClient dynamoDbEnhancedClient() { return DynamoDbEnhancedClient.create(); } @Bean public DynamoDbTable<DynamoOrder> orderTable(DynamoDbEnhancedClient enhancedClient) { return enhancedClient.table("your-order-table-name", TableSchema.fromBean(DynamoOrder.class)); } }
之后在业务类中通过依赖注入获取DynamoDbTable实例,替代自定义的getTable()方法。
4. 排查类加载冲突
- 检查是否存在自定义类加载器配置,或第三方框架(如Spring Cloud)引入的类加载规则,避免重复加载SDK核心类。
- 若使用Spring Cloud AWS,确保其版本与AWS SDK v2兼容,避免依赖冲突。
内容的提问来源于stack exchange,提问作者Humid-IDE

