在Amazon DynamoDB中从键更改为Map <String,AttributeValue>引发异常

时间:2019-06-13 00:03:42

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

最近,我正在更改代码,以将其从Amazon S3的版本2迁移到版本4。在进行此更改时,我知道Key类不再存在。其中一篇帖子要求我将Key更改为Map,现在在创建批获取项目请求时遇到异常。

例外

Caused by: com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: L7J3ERURVAS0TRV4M1UV2GL09NVV4KQNSO5AEMVJF66Q9ASUAAJG)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1701)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1356)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1102)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:759)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:733)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:715)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:675)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:657)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:521)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:4230)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:4197)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.executeBatchGetItem(AmazonDynamoDBClient.java:509)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.batchGetItem(AmazonDynamoDBClient.java:476)
at com.example.anomalytics.DynamoDbStore.getAll(DynamoDbStore.java:156)
at com.example.anomalytics.CachedStore.getAll(CachedStore.java:97)
at com.example.anomalytics.Mapper.getEncryptedEntries(Mapper.java:45)
at com.example.anomalytics.Mapper.getAndDecryptEntries(Mapper.java:50)
at com.example.anomalytics.MapResource.getEntries(MapResource.java:48)
at com.example.anomalytics.MapResource.getEntries(MapResource.java:80) 

旧代码

ImmutableSet.Builder<Map<String, AttributeValue>> keyBuilder = ImmutableSet.builder();
for (CompositeKey key : keys) {
    keyBuilder.add(dynamoKey(key));
}

KeysAndAttributes requestKeys = new KeysAndAttributes().withKeys(keyBuilder.build());

BatchGetItemRequest request = new BatchGetItemRequest().withRequestItems(ImmutableMap.of(tableName, requestKeys));

private static Map<String, AttributeValue> dynamoKey(CompositeKey key)
{
    return new Key().withHashKeyElement(new AttributeValue().withS(key.getKey()));;
}

新代码

ImmutableSet.Builder<Map<String, AttributeValue>> keyBuilder = ImmutableSet.builder();
for (CompositeKey key : keys) {
    keyBuilder.add(dynamoKey(key));
}

KeysAndAttributes requestKeys = new KeysAndAttributes().withKeys(keyBuilder.build());

BatchGetItemRequest request = new BatchGetItemRequest().withRequestItems(ImmutableMap.of(tableName, requestKeys));


private static Map<String, AttributeValue> dynamoKey(CompositeKey key)
{
    Map<String, AttributeValue> map = new HashMap<>();
    map.put(key.getKey(), new AttributeValue().withS(key.getKey()));
    return map;
}

请帮助。

0 个答案:

没有答案