当JSON中存在时,Java DynamoDB Validation异常需要“key not given”

时间:2017-11-01 05:21:03

标签: java json amazon-web-services amazon-dynamodb

在运行dynamoDB .putItem()时遇到异常。

表格定义:

{
  "AttributeDefinitions": [
    {
      "AttributeName": "storage_CACHE_KEY",
      "AttributeType": "S"
    }
  ],
  "TableName": "my-table",
  "KeySchema": [
    {
      "AttributeName": "storage_CACHE_KEY",
      "KeyType": "HASH"
    }
  ],
  "TableStatus": "ACTIVE",
  "CreationDateTime": "2017-11-01T05:01:18.883Z",
  "ProvisionedThroughput": {
    "LastIncreaseDateTime": "1970-01-01T00:00:00.000Z",
    "LastDecreaseDateTime": "1970-01-01T00:00:00.000Z",
    "NumberOfDecreasesToday": 0,
    "ReadCapacityUnits": 3,
    "WriteCapacityUnits": 3
  },
  "TableSizeBytes": 199,
  "ItemCount": 1,
  "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/my-table"
} 

此外,我尝试在序列化为JSON时尝试放置的值如下所示:

{
  "storage_CACHE_KEY" : "storage_cache_key_value",
  "some_other_fields" : [""]
}

我仍然无法弄清楚为什么会出现以下错误:

com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: One of the required keys was not given a value (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID:

更新:如何使用.putItem

public <T> PutItemResult put(String key, T value, Optional<Long> expires) throws JsonProcessingException {
    PutItemRequest req = (new PutItemRequest()).withTableName(this.tableName).withItem(this.keyValuePair(key, value, expires));
    return this.db.putItem(req);
}
private Map<String, AttributeValue> buildKey(String value) {
    Map<String, AttributeValue> key = new HashMap();
    key.put("name", new AttributeValue(value));
    return key;
}

private <T> Map<String, AttributeValue> keyValuePair(String key, T value, Optional<Long> expires) throws JsonProcessingException {
    Map<String, AttributeValue> item = this.buildKey(key);
    item.put("json", new AttributeValue(this.mapper.writeValueAsString(value)));
    if (expires.isPresent()) {
        item.put(this.ttlKey, (new AttributeValue()).withN(((Long)expires.get()).toString()));
    }

    return item;
}

我已经介绍了这段代码,并且已经看到T value是JSON,正是我上面发布的格式。

更新:当我将地图条目从name更改为storage_CACHE_KEY时,putItem成功,但现在读取无法编组回我的对象​​。存储在我的本地dynamodb中的json用于输入:

{
  "storage_CACHE_KEY": "4728264794434232301",
  "json": "{\"storage_CACHE_KEY\":\"23232432472826479401\", \"otherFields\": \"example\"}"
}

(0已知属性:]) 无法识别的字段“present”(类java.util.Optional),未标记为可忽略的

1 个答案:

答案 0 :(得分:0)

我花了整整一天的时间解决此错误的实例。我还没有研究过您的问题,以了解它是否相关,但可以提供它的价值。我的原因是以一种方式创建表并以另一种方式访问​​它。具体来说,我应该在createTable中使用com.amazonaws.services.dynamodbv2.document(返回CreateTableResult)时在createTable中使用com.amazonaws.services.dynamodbv2(返回一个表)来创建表。如果使用前者创建,然后尝试使用mapper.load()从Java映射器访问表,则会出现错误。

只要将表描述为TableDescription,然后用.toString()将其转换为String,就可以完全避免混淆,无论哪种方式,您都会获得完全相同的描述(扣除创建日期等)创建表。但是尽管如此,它们与Java映射器并不相同。