在运行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),未标记为可忽略的
答案 0 :(得分:0)
我花了整整一天的时间解决此错误的实例。我还没有研究过您的问题,以了解它是否相关,但可以提供它的价值。我的原因是以一种方式创建表并以另一种方式访问它。具体来说,我应该在createTable
中使用com.amazonaws.services.dynamodbv2.document
(返回CreateTableResult)时在createTable
中使用com.amazonaws.services.dynamodbv2
(返回一个表)来创建表。如果使用前者创建,然后尝试使用mapper.load()
从Java映射器访问表,则会出现错误。
只要将表描述为TableDescription
,然后用.toString()
将其转换为String,就可以完全避免混淆,无论哪种方式,您都会获得完全相同的描述(扣除创建日期等)创建表。但是尽管如此,它们与Java映射器并不相同。