我刚刚开始使用我的第一个DynamoDB项目,并且我一直在努力阅读文档。我认为我项目的最佳可能性是使用SDK中的高级DynamoDbMapper来允许CRUD操作。
在DynamoDB文档中,有一种属性值' M'这可以在这里看到 http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.html
在较低级别的Java API中,例如getItem或getItemBatch,此值类型转换为java.util.map<>。
但我似乎无法找到任何可以使用HigherLevel DBMapper来使用此数据类型的资源。支持的数据类型。 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.DataTypes.html
我注意到在页面底部,它为创建自己的更高级别的映射系统提供了一些见解。但我想我先在这里先问一下这个问题。所以我想我的问题是......无论如何使用DynamoDBMapper来处理Java.Util.Map数据类型?
我在谷歌上找到的唯一见解是这个奇怪的github错误,用户似乎正在做我想做的事情。 https://github.com/aws/aws-sdk-java/issues/520
希望这是有道理的。 拉尔夫
答案 0 :(得分:1)
更新:注意到您需要将Java.Util.Map属性映射到DynamoDB地图属性,因此下面的所有内容都无法回答您的问题,抱歉。在我的例子中,使用了自定义类的属性,而不是Java.Util.Map类的属性。
假设您的表名为“my_table”,并假设以下是记录的json转储:
{
uuid: "52f9d257-7998-4379-928b-9d41d70dd8a8",
my_map: {
field1: 123,
field2: 456
}
}
(此处my_map是'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;
}
}
和第二个 - 对于my_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);
希望这有帮助!
答案 1 :(得分:0)
有点老帖但我认为值得回答我的经历。 我在DynamoDB Map中注意到的是它支持使用String作为键的map。因此,如果你有Map它应该工作(转换模式为ConversionSchemas.V2,如解释here(基本上创建你的DynamoDB映射器,如下所示 -
DynamoDBMapper dbMapper = new DynamoDBMapper(dbClient, DynamoDBMapperConfig.DEFAULT);
现在,Map的Value部分也应该是受支持的dynamoDB数据类型;这意味着它可以有数字,字符串等。
如果您没有键(或/和值)作为String,那么您需要编写自己的转换器。 这是我用于LocalDate的转换器示例,使用Map作为键。
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;
}
希望这有帮助。