DynamoDB 嵌套映射到 Java 对象

问题描述 投票:0回答:2

我使用的是 DynamoDB 表,其中 DynamoDBAttributeType.M 映射相互嵌套。我遇到问题的表字段如下所示:

"Data": {
  "EnglishName": "Balcony",
  "High": {
    "Status": true,
    "Triggered": true,
    "Value": 5
  },
  "Low": {
    "Status": true,
    "Triggered": false,
    "Value": 1
  },
  "TagName": "tag1"
}

映射的所有键都是字符串,一些值是字符串,一些是映射。在我的Java代码中,数据由一个类表示,它是另一个类的属性,代表整个表。属性“低”和“高”也由 Java 类和数据类的属性表示。

我尝试使用多种方法将其映射到 Java 对象,主要是通过 DynamoDBTypeConverter。最困难的部分是我无法通过谷歌找到任何关于此的信息。我只找到了一个转换器类的示例,其中属性类型是 S 而不是 M。

我不断收到错误:

无法取消转换属性

如何做到这一点?

java nested amazon-dynamodb
2个回答
2
投票

我终于有了一个有效的解决方案。基本上答案是在 DynamoDBTypeConverter 中使用 Map 和所需的对象类型,如下所示:

public class DataConverter implements DynamoDBTypeConverter<Map<String, AttributeValue>, Data> {

@Override
public Map<String, AttributeValue> convert(Data data) {
    
    ObjectMapper mapper = new ObjectMapper();
    
    Item item = new Item()
           .withString("englishName", data.getEnglishName())
           .withMap("high", mapper.convertValue(data.getHigh(), Map.class))
           .withMap("low", mapper.convertValue(data.getLow(), Map.class))
           .withString("tagName", data.getTagName());

    return ItemUtils.toAttributeValues(item);
}

@Override
public Data unconvert(Map<String, AttributeValue> data) {
    Data tagData = new Data();
    try {
        ObjectMapper mapper = new ObjectMapper();
        String item = ItemUtils.toItem(data).toJSON();
        JsonNode json = mapper.readTree(item);
        tagData = mapper.convertValue(json, Data.class);
        
    } catch (JsonProcessingException ex) {
        Logger.getLogger(TagDataConverter.class.getName()).log(Level.SEVERE, null, ex);
    }       
    return tagData;
}    

我还需要将类型转换器写入对象属性并在类中对其进行注释:

public class Data {

    private String tagName;

    private String englishName;

    @DynamoDBTypeConverted(converter = AlertConverter.class)
    private Alert low;

    @DynamoDBTypeConverted(converter = AlertConverter.class)
    private Alert high;

AlertConverter.class 是一个普通的 DynamoDBTypeConverter,它接受


0
投票

您尝试过使用Gson之类的工具吗?如果您要以 JSON 字符串形式返回 DynamoDB 响应,请尝试以下操作:

Gson gson = new Gson();
Data data = gson.fromJson(jsonString, Data.class);
© www.soinside.com 2019 - 2024. All rights reserved.