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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:45:03