Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DynamoDBMapper。映射属性值';M';_Java_Amazon Web Services_Dictionary_Amazon Dynamodb - Fatal编程技术网

Java DynamoDBMapper。映射属性值';M';

Java DynamoDBMapper。映射属性值';M';,java,amazon-web-services,dictionary,amazon-dynamodb,Java,Amazon Web Services,Dictionary,Amazon Dynamodb,我刚刚开始我的第一个DynamoDB项目,我一直在尽可能多地阅读文档。我认为我的项目最好的可能性是使用SDK中的高级DynamoDbMapper来允许CRUD操作 在DynamoDB文档中有一种类型的属性值“M”,可以在这里看到 在较低级别的java API(如getItem或getItemBatch)中,此值类型转换为java.util.map 但我似乎找不到任何可以使用高级DBMapper来使用这种数据类型的资源。此处支持的数据类型。 我注意到在页面底部,它提供了一些关于创建自己的更高级

我刚刚开始我的第一个DynamoDB项目,我一直在尽可能多地阅读文档。我认为我的项目最好的可能性是使用SDK中的高级DynamoDbMapper来允许CRUD操作

在DynamoDB文档中有一种类型的属性值“M”,可以在这里看到

在较低级别的java API(如getItem或getItemBatch)中,此值类型转换为java.util.map

但我似乎找不到任何可以使用高级DBMapper来使用这种数据类型的资源。此处支持的数据类型。

我注意到在页面底部,它提供了一些关于创建自己的更高级别映射系统的见解。但我想我会先在这里问一下,然后再深入到代码中去尝试。所以我想我的问题是。。。是否仍然可以使用DynamoDBMapper处理Java.Util.Map数据类型

我能在谷歌上找到的唯一洞察就是这个奇怪的github错误,用户似乎在做我想做的事情。

希望这是有意义的。
Ralph

更新:注意到您需要将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;
    }       
}
第二个是“我的地图”字段:

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);

希望这有帮助

有点老了,但我认为在这里回答我的经验是值得的。 我注意到dynamodbmap支持使用字符串作为键的Map。因此,如果您有Map,它应该可以工作(转换模式如ConversionSchemas.V2所述(基本上创建DynamoDB映射器,如下所示)-

DynamoDBMapper dbMapper = new DynamoDBMapper(dbClient, DynamoDBMapperConfig.DEFAULT);
现在,这个映射的值部分也应该是受支持的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;

}
public类LocalDateMapConverter实现DynamoDBTypeConverter{
@凌驾
公共映射转换(映射LocalDateToString映射){
返回localDateToStringMap.entrySet()
.stream()
.collect(toMap(k->k.getKey().toString(),
Map.Entry::getValue));
}
@凌驾
公共映射取消插入(映射stringToLocalDateMap){
返回stringToLocalDateMap.entrySet()
.stream()
.collect(toMap(k->LocalDate.parse(k.getKey()),
Map.Entry::getValue));
}
}
@DynamoDBTable(tableName=“someTable”)
公共类数据表{
@DynamoDBHashKey(attributeName=“someKey”)
私钥;
@DynamoDBAttribute(attributeName=“someMapName”)
@DynamoDBTypeConverted(converter=LocalDateMapConverter.class)
私人地图;
}

希望这能有所帮助。

你有没有想过?