当前位置: 首页 > 知识库问答 >
问题:

Java DynamoDBMapper。映射属性值“M”

杨安歌
2023-03-14

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

在DynamoDB文档中,有一种属性值“M”的类型,可以在这里看到http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.html

在较低级别的java应用编程接口中,如getItem或getItemBatch,此值类型转换为java.util.map

但是我似乎找不到任何资源表明我可以使用高级别DBMapper来使用这种数据类型。这里支持的数据类型。http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.DataTypes.html

我注意到在页面底部,它提供了一些关于创建自己的更高级别映射系统的见解。但我想我应该先在这里问一下,然后再深入到代码中去尝试。所以我想我的问题是。。。是否有任何方法可以使用DynamoDBMapper与Java一起工作。Util。地图数据类型?

我能在谷歌上找到的唯一洞见就是这个奇怪的github错误,用户似乎在做我想做的事情。https://github.com/aws/aws-sdk-java/issues/520

希望这有意义。拉尔夫

共有2个答案

孟翰海
2023-03-14

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

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

现在,这个Map的Value部分也应该是受支持的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;

}

希望这有帮助。

令狐翰
2023-03-14

更新:注意到您需要映射一个Java。Util。将属性映射到DynamoDB映射属性,因此下面的所有内容都无法回答您的问题,抱歉。在我的例子中,使用的是自定义类的属性,而不是Java的属性。Util。地图课。

假设您的表名为“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);

希望这有帮助!

 类似资料:
  • 我需要将源类中的字段值映射到字段属性。我可以使用Mapstruct使用@mapper注释的'expression'参数来完成 有没有其他方法可以不使用“表达式”来进行映射?

  • 我目前正在尝试使用ModelMapper的映射方法执行实体到DTO的映射。在最深的属性映射上,映射结果为null,但它应该是一个对象。 以下是我的映射源实体(省略brevety的Loombok getter和setter): 以下是我的目标DTO(省略brevety的Loombok Getter和Setter): 在我的Controller类方法上,我这样做映射: My clientService

  • 鉴于 和 如何在Orika中映射以下内容? 我需要定制的映射器或过滤器吗?

  • 问题内容: 我正在使用MapStruct库映射对象,但出现此错误: 无法将属性“ java.util.Date aDate”映射到“ javax.xml.bind.JAXBElement ADATE”。考虑声明/实现一个映射方法:“ javax.xml.bind.JAXBElement map(java.util.Date value)”。 我的问题:应该在哪里取消此映射方法? 问题答案: 我通过

  • 我正在使用DTO对象从spring rest控制器中的@RequestBody中检索信息,并在json响应中使用相同的DTO对象。我想完全隐藏一些字段不让响应。 我尝试了,它为未映射的属性返回null,但我的问题是: null FieldBonlyOrderToOrderToMapper 将返回一个OrderDto对象,该对象没有名为(otherFiledA)的字段

  • 映射器类如下所示: