Dynamodb SDK v2如何映射HashMap属性字段?迁移遇转换错误求解
解决DynamoDB SDK v2增强客户端HashMap字段映射错误问题
解决方案1:将HashMap替换为Map接口类型
DynamoDB SDK v2增强客户端默认支持Map<String, Double>这类接口类型的字段映射,无需额外转换器,这也是官方推荐的简化方式。修改实体类如下:
@Getter @Setter @DynamoDbBean public class UserOrders { private String userId; // 将HashMap改为Map接口类型 private Map<String, Double> orders; @DynamoDbPartitionKey public String getUserId() { return this.userId; } }
解决方案2:自定义转换器(需保留HashMap时使用)
如果业务逻辑必须依赖HashMap具体实现类,需要自定义字段转换器并绑定到目标字段:
步骤1:实现AttributeConverter接口
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter; import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType; import software.amazon.awssdk.enhanced.dynamodb.EnhancedType; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import java.util.HashMap; import java.util.Map; public class HashMapConverter implements AttributeConverter<HashMap<String, Double>> { @Override public AttributeValue transformFrom(HashMap<String, Double> input) { Map<String, AttributeValue> attributeMap = new HashMap<>(); input.forEach((key, value) -> attributeMap.put(key, AttributeValue.builder().n(value.toString()).build()) ); return AttributeValue.builder().m(attributeMap).build(); } @Override public HashMap<String, Double> transformTo(AttributeValue input) { HashMap<String, Double> hashMap = new HashMap<>(); input.m().forEach((key, value) -> hashMap.put(key, Double.valueOf(value.n())) ); return hashMap; } @Override public EnhancedType<HashMap<String, Double>> type() { return EnhancedType.of(HashMap.class, EnhancedType.of(String.class), EnhancedType.of(Double.class)); } @Override public AttributeValueType attributeValueType() { return AttributeValueType.MAP; } }
步骤2:在实体类字段上绑定转换器
@Getter @Setter @DynamoDbBean public class UserOrders { private String userId; // 绑定自定义转换器 @DynamoDbConvertedBy(HashMapConverter.class) private HashMap<String, Double> orders; @DynamoDbPartitionKey public String getUserId() { return this.userId; } }
原因说明
SDK v1的注解映射逻辑会自动兼容集合具体实现类,但v2增强客户端采用了面向接口的设计思路,默认仅为List、Map等通用接口提供内置转换器,对于HashMap这类具体实现类则需要显式处理。
内容的提问来源于stack exchange,提问作者BenBit
相关产品推荐
相关产品推荐

