DynamoDb无法保存地图数据(java)

时间:2017-10-03 12:21:36

标签: amazon-web-services amazon-dynamodb

我正在尝试将数据保存到dynamoDb中,但该数据也包含一些Map属性。但是我在保存数据时遇到错误。以下是我用于保存请求数据的域类:

@DynamoDBTable(tableName = "ottMiddleware_rails")
public class RailsCmsDomain {

@DynamoDBHashKey(attributeName = "railId")
private String railId;

@DynamoDBTyped
@DynamoDBAttribute(attributeName = "railLogic")
private Map<String, Object> railLogic;

@DynamoDBAttribute(attributeName = "railSourceType")
private String railSourceType;

@DynamoDBAttribute(attributeName = "railTitle")
private RailCmsTitleDomain railTitle;

@DynamoDBTyped
@DynamoDBAttribute(attributeName = "restrictions")
private Map<String, Object> restrictions;

我提出以下要求:

{
"railId": "railOne",
"railLogic": {
"programType": 1,
"railSourceUrl": "http://myUrl"
},
"railSourceType": "myRail",
"railTitle": {
"tam": "Raan Phan",
"def": "சிறப்பு கட்டமைப்பு"
},
"restrictions": {
"clients": [
  "abc",
  "xyz"
],
"periodStart": 1506572217
}
}

我使用以下代码将数据保存到dynamoDb

public Boolean saveUpdateRailsDetails(RailsCmsDomain railsDomain) {
    DynamoDBUtil dynamoDBUtil = new DynamoDBUtil();
    AmazonDynamoDB dynamoDBClient = dynamoDBUtil.getDynamoDBClient();
    DynamoDBMapper mapper = new DynamoDBMapper(dynamoDBClient);
    mapper.save(railsDomain);
    return true;
}

请建议如何将地图保存到dynamoDb中。我将数据作为地图,因为在后期阶段,可能会有更多数据添加到这些属性中,这些属性是地图,数据可以是任何数据类型。我收到了以下错误:

errorMessage": "not supported; requires @DynamoDBTyped or 
@DynamoDBTypeConverted"
"errorType": 
"com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException"

3 个答案:

答案 0 :(得分:1)

当我需要在dynamodb中存储地图时,我只是使用@DynamoDBTypeConverted(converter = MapConverter.class)注释地图的getter方法,并在转换器中将地图序列化为json字符串,这样您就可以检索地图如果你需要的话,一切都不能在queryExpressions中使用它。

因此,如果您希望能够查询地图中的对象,可以考虑使用@DynamoDBDocument在地图中注释您正在使用的对象,这样它将被dynamodb自动序列化为文档并且使用Set而不是map到您的父对象。

答案 1 :(得分:0)

问题是DynamoDB Mapper不知道如何编组/解组此行中的Object

private Map<String, Object> railLogic;

如果您不想将Object更改为String,请使用DynamoDBTypeConverted注释为Map<String, Object>提供自定义编组程序,然后您可以(可能)重用restrictions。相关文档here

答案 2 :(得分:0)

我想将此答案作为选项发布,但它不会将数据存储为DynamoDB中的地图。但是,它将解决错误。

您可以定义restrictions属性,如下所述。它将数据存储为DynamoDB中的JSON字符串。

@DynamoDBTypeConvertedJson
private Map<String, Object> restrictions;

<强>缺点: -

如果要更新restrictions属性,则需要从数据库获取当前值,更新它并将数据保存在数据库中。

DynamoDB数据: -

restrictions属性保存为JSON字符串。

enter image description here