java dynamodbmapperMap属性值“m”

fiei3ece  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(268)

我刚刚开始我的第一个dynamodb项目,我一直在尽可能多地阅读文档。我认为我的项目最好的可能性是使用sdk中的高级dynamodbmapper来允许crud操作。
在dynamodb文档中有一种类型的属性值'm',可以在这里看到http://docs.aws.amazon.com/amazondynamodb/latest/apireference/api_attributevalue.html
在较低级别的JavaAPI(如getitem或getitembatch)中,此值类型转换为java.util.map。
但是我似乎找不到任何可以使用更高级别dbmapper来使用这种数据类型的资源。此处显示支持的数据类型。http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/dynamodbmapper.datatypes.html
我注意到在页面的底部,它提供了一些关于创建自己的更高级别Map系统的见解。但我想我应该先问一下这里,然后再深入到代码中去尝试。所以我想我的问题是。。。是否仍然可以使用dynamodbmapper处理java.util.map数据类型?
我能在google上找到的唯一的见解就是这个奇怪的github错误,用户似乎在做我想做的事情。https://github.com/aws/aws-sdk-java/issues/520
希望这有意义。拉尔夫

yzxexxkh

yzxexxkh1#

更新:注意到您需要将java.util.map属性Map到dynamodbmap属性中,因此下面的所有内容都不能回答您的问题,抱歉。在我的例子中,使用的是自定义类的属性,而不是java.util.map类的属性。
假设您的表名为“my\u table”,并且假设下面是一个记录的json转储:

{
  uuid: "52f9d257-7998-4379-928b-9d41d70dd8a8",
  my_map: {
    field1: 123,
    field2: 456
  }  
}

(此处我的\uMap是所需的“m”类型字段)
要将dynamodbmapper用于此类表,您需要创建两个带注解的类,第一个用于表本身:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;

@DynamoDBTable(tableName="my_table")
public class MyClass {
    private String uuid;
    private MyMapClass myMap; 

    @DynamoDBHashKey(attributeName="uuid")
    public String getUuid() {
        return uuid;
    }   
    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    @DynamoDBAttribute(attributeName = "my_map")    
    public MyMapClass getMyMap() {
        return myMap;
    }
    public void setMyMap(MyMapClass myMap) {
        this.myMap = myMap;
    }       
}

第二个是“我的Map”字段:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument;

@DynamoDBDocument
public class MyMapClass {
    private int field1;
    private int field2;

    @DynamoDBAttribute(attributeName = "field1")    
    public int getField1() {
        return field1;
    }
    public void setField1(int field1) {
        this.field1 = field1;
    }

    @DynamoDBAttribute(attributeName = "field2")    
    public int getField2() {
        return field2;
    }
    public void setField2(int field2) {
        this.field2 = field2;
    }
}

下面是一个用法示例:

...
DynamoDBMapper dbMapper = new DynamoDBMapper(dbClient);
...
MyClass item = new MyClass();
item.setUuid("52f9d257-7998-4379-928b-9d41d70dd8a8");
MyMapClass map = new MyMapClass();
map.setField1(123);
map.setField2(456);
item.setMyMap(map);
dbMapper.save(item);

希望这有帮助!

55ooxyrt

55ooxyrt2#

一个有点旧的职位,但我认为值得回答我的经验在这里。我注意到dynamodbmap支持以字符串作为键的map。因此,如果您有map,它应该可以工作(转换模式为conversionschemas.v2,如下所述(基本上创建dynamodbMap器)-

DynamoDBMapper dbMapper = new DynamoDBMapper(dbClient, DynamoDBMapperConfig.DEFAULT);

现在这个Map的值部分也应该是受支持的dynamodb数据类型;这意味着它可以有数字,字符串等。
如果没有键(或/和值)作为字符串,则需要编写自己的转换器。下面是我的转换器的示例,我使用map作为键用于localdate。

public class LocalDateMapConverter implements DynamoDBTypeConverter< Map<String, Long>, Map<LocalDate, Long>> {
@Override
public Map<String, Long> convert(Map<LocalDate, Long> localDateToStringMap) {
    return localDateToStringMap.entrySet()
            .stream()
            .collect(toMap(k -> k.getKey().toString(),
                    Map.Entry::getValue));
}

@Override
public Map<LocalDate, Long> unconvert(Map<String, Long> stringToLocalDateMap) {
    return stringToLocalDateMap.entrySet()
            .stream()
            .collect(toMap(k -> LocalDate.parse(k.getKey()),
                    Map.Entry::getValue));
}
}

@DynamoDBTable(tableName = "someTable")
public class SomeTable {

@DynamoDBHashKey(attributeName = "someKey")
    private String key;

@DynamoDBAttribute(attributeName = "someMapName")
    @DynamoDBTypeConverted(converter = LocalDateMapConverter.class)
    private Map<LocalDate, Long> someMap;

}

希望这有帮助。

相关问题