2017-10-01 1 views
0

Dynamo DBのデータを更新する際に、暗号化された属性transactionAmountに保存式を使用しています。ただし、更新クエリがConditionalCheckFailedExceptionで失敗しています。データは、前述のhereと同じ方法で、Dynamodbの初期永続化中にクライアント側で暗号化されます。され、次のコード:DynamoDBの暗号化された属性に式を保存します。

データ転送オブジェクト:

public final class SampleDTO { 

@DynamoDBHashKey(attributeName = CommonDynamoDBSchemaConstants.UNIQUE_KEY) 
@Getter(onMethod = @__({ @DoNotTouch })) 
private String uniqueKey; 

@DynamoDBAttribute(attributeName = CommonDynamoDBSchemaConstants.EVENT_RUNNING_TIME_EPOCH) 
@Getter(onMethod = @__({ @DoNotTouch })) 
private Long eventRunningTimeInEpoch; 

@DynamoDBAttribute(attributeName = CommonDynamoDBSchemaConstants.INSTRUMENT_TYPE) 
@DynamoDBTypeConverted(converter = InstrumentTypeConverter.class) 
@Getter(onMethod = @__({ @DoNotTouch })) 
private InstrumentType instrumentType; 

@DynamoDBAttribute(attributeName = CommonDynamoDBSchemaConstants.TRANSACTION_AMOUNT) 
private String transactionAmount; 

} 

データアクセスコード:

// fetches data from dynamoDB based on unique key passed to it. 
SampleDTO sampleDTO = getSampleDTO("testLedgerUniqueKey"); 
sampleDTO.setInstrumentType(InstrumentType.MACHINE); 

DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression(); 
      Map<String, ExpectedAttributeValue> expressionAttributeValues = 
        new HashMap<String, ExpectedAttributeValue>(); 

     expressionAttributeValues.put(
       CommonDynamoDBSchemaConstants.LEDGER_UNIQUE_KEY, 
       new ExpectedAttributeValue(true) 
         .withValue(new AttributeValue(sampleDTO.getLedgerUniqueKey()))); 
     expressionAttributeValues.put(
       CommonDynamoDBSchemaConstants.TRANSACTION_AMOUNT, 
       new ExpectedAttributeValue(true).withValue(
         new AttributeValue(sampleDTO.getTransactionAmount()))); 

     saveExpression.setExpected(expressionAttributeValues); 
     saveExpression.setConditionalOperator(ConditionalOperator.AND); 

     dynamoDBMapper.save(sampleDTO, saveExpression, null /*dynamoDBMapperConfig*/); 

答えて

0

ConditionalCheckFailedException:

あなたは存在しないレコードを更新しようとしていますあなたの質問条件。クエリ条件を確認して、クエリがレコードを返すことを確認してください。

参考:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.MessagesAndCodes

あなたはfalseに評価された状態を指定しました。たとえば、 はアイテムに対して条件付き更新を実行しようとしましたが、 の実際の値が 条件の期待値と一致しませんでした。

希望します。

+0

dynamoDBにレコードがあります。 'transactionAmount'でexpressionAttributeValueを削除すると、条件付き保存が成功します。唯一の問題は 'transactionAmount'が暗号化された値として存在することです。 AFAIK、dynamoDBMapperは私たちの暗号化/復号化を処理します。 –

関連する問題