我正在处理ConditionalCheckFailedException,但我不确定是哪种条件未能通过检查。当我打开调试器并检查异常变量时,找不到任何有用的信息。
以下是我的Java Dynamo客户端代码。我试图在以下情况下使用DynamoDBSaveExpression对DynamoDB进行条件写入:
表中的客户日期早于我尝试写入的当前客户日期(存储为EPOCH时间)
表中不存在条目(我检查FEEDBACK_KEY,因为它是表中的主键)
当我将第一个条目写入表时,它可以工作,但是在存在条目的更新中,我收到ConditionalCheckFailedException异常。有任何想法吗?
final DynamoDBSaveExpression expression = new DynamoDBSaveExpression();
final Map<String, ExpectedAttributeValue> expectedAttributes =
ImmutableMap.<String, ExpectedAttributeValue>builder()
.put(ThemesMessageEligibility.TableKeys.CLIENT_DATE,
new ExpectedAttributeValue()
.withComparisonOperator(ComparisonOperator.LT)
.withValue(new AttributeValue().withN(clientDate)))
.put(ThemesMessageEligibility.TableKeys.FEEDBACK_KEY,
new ExpectedAttributeValue(false))
.build();
expression.setExpected(expectedAttributes);
expression.setConditionalOperator(ConditionalOperator.OR);
// Conditional write if the clientDate is after the dynamo's client Date
try {
dynamoMapper.save(themesFeedbackComponentContainer, expression);
} catch (ConditionalCheckFailedException ex) {
...
}
最佳答案
我将删除第二个条件,或对其进行更改,以使其在现有项目(new ExpectedAttributeValue(true)
)上成为条件。即使存在,UpdateItem也会覆盖现有项,因此,似乎CLIENT_DATE条件是唯一需要的条件。
如上编写的API调用将仅在第一次写入时成功(即,当该项不存在时)成功。回顾一下,如果您只希望对项目的第一次写入成功(如果该项目已经存在,则失败),则不需要CLIENT_DATE条件(因为在现有映像中没有可比较的属性)。