2016-10-06 5 views
2

Ich habe mit einer ConditionalCheckFailedException zu tun, und ich bin nicht genau sicher, welche Bedingung die Prüfung nicht besteht. Wenn ich den Debugger öffne und die Ausnahmevariable untersuche, kann ich keine nützlichen Informationen finden.DynamoDB: ConditionalCheckFailedException

Unten ist mein Java Dynamo Client-Code. Ich versuche, DynamoDB mit dynamoDBSaveExpression bedingte schreiben, wenn:

Das Client-Datum in der Tabelle kommt vor dem aktuellen Client-Datum, das ich versuche zu schreiben (als EPOCH Zeit gespeichert) Ein Eintrag existiert nicht in der Tabelle (Ich überprüfe für den FEEDBACK_KEY, da es der Primärschlüssel in meiner Tabelle ist) Wenn ich den ersten Eintrag in die Tabelle schreibe, funktioniert es, aber bei Updates, wenn ein Eintrag existiert, bekomme ich die ConditionalCheckFailedException Ausnahme. Irgendwelche Ideen?

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) { 
    ... 
} 

Antwort

1

würde ich die zweite Bedingung entfernen oder ändern, so dass es Bedingungen auf dem Punkt bestehende (new ExpectedAttributeValue(true)). UpdateItem überschreibt nur das vorhandene Element, selbst wenn es vorhanden ist. Daher scheint die CLIENT_DATE-Bedingung die einzige zu sein, die Sie benötigen.

Der oben beschriebene API-Aufruf wird nur beim ersten Schreiben erfolgreich sein (dh wenn das Element nicht existiert). Wenn Sie im Nachhinein nur den ersten Schreibvorgang für ein Element ausführen möchten (und fehlschlagen, wenn das Element bereits vorhanden ist), ist die CLIENT_DATE-Bedingung nicht erforderlich (da im vorhandenen Bild keine Attribute zum Vergleichen vorhanden sind).