2

我正在处理 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) {
   ...
}
4

1 回答 1

1

我将删除第二个条件,或将其更改为以现有项目 ( new ExpectedAttributeValue(true)) 为条件。UpdateItem 只会覆盖现有项目,即使它存在,所以看起来 CLIENT_DATE 条件是您唯一需要的条件。

上面写的 API 调用只会在第一次写入时成功(即当项目不存在时)。回想起来,如果您只希望第一次写入项目成功(如果项目已经存在则失败),则不需要 CLIENT_DATE 条件(因为现有图像中没有可比较的属性)。

于 2017-02-12T11:58:39.797 回答