2017-07-29 5 views
0

Ich habe ein boolean in DynamoDB wie unten in meinem Code abgebildet -DynamoDB: DynamoDB Mapper gibt null zurück, für Boolesche Wert

@DynamoDBAttribute(attributeName = "isFlagged") 
    public Boolean getFlagged() { 
     return isFlagged; 
    } 

ich immer eine Null, wenn ich die Tabelle mit DynamoDB Mapper abfragen. Also habe ich eine Dokumentation und hinzugefügt, um die Anmerkung -

@DynamoDBConvertedBool(DynamoDBConvertedBool.Format.true_false) 
    @DynamoDBAttribute(attributeName = "isFlagged") 
    public Boolean getFlagged() { 
     return isFlagged; 
    } 

Ich erhalte einen ‚konnte nicht unconvert Attribut‘ Fehler. Wie kann ich das beheben?

PS - Ich bin ein DynamoDB Anfänger, danke für jede Hilfe.

Antwort

1

Es scheint, dass ein Problem mit dem Format der in DynamoDB gespeicherten Daten besteht.

Zunächst einmal das ist, was DynamoDB erwartet:

Boolean

Ein Boolean-type-Attribut speichern kann entweder wahr oder falsch.

Überprüfen Sie Daten in Tabellen tatsächlich entspricht dies. Haben Sie Artikel, die nicht über das Attribut "isFlagged" verfügen? Sind einige von ihnen null?

Wenn benötigen Sie leere Werte/NULL-Werte Boolesche Werte Sie Ihre benutzerdefinierten Konverter implementieren müssen konvertieren, die eine lächerlich einfache Schnittstelle hat:

// Converts between String (DynamoDB side) and Boolean (application side) 
public class MyBooleanConverter implements DynamoDBTypeConverter<String, Boolean> { 

    // Add any checks/conversions you see fit: 
    @Override 
    // Convert to DynamoDB attribute 
    public String convert(Boolean object) { 
     return object.toString(); 
    } 

    @Override 
    // Convert from DynamoDB attribute 
    public Boolean unconvert(String object) { 
     // Parse as you see necessary here 
     return Boolean.parse(object); 
    } 
} 

Jetzt Ihr Attribut mit Ihrem Konverter mit Anmerkungen versehen:

@DynamoDBConvertedBool(converter = MyBooleanConverter.class) 
    @DynamoDBAttribute(attributeName = "isFlagged") 
    public Boolean getFlagged() { 
    ... 
    } 

PS

Sie brauchen nicht einen Attributnamen angeben, wenn Ihre Methode Name Ihre Attributnamen übereinstimmt:

@DynamoDBConvertedBool(converter = MyBooleanConverter.class) 
    public Boolean isFlagged() { 
    ... 
    } 

genug sein sollte. Auch boolesche Getter sollten das isX Format haben.

+0

Eigentlich habe ich nur 2 Datensätze in der Tabelle und beide haben Werte. Wenn also alle Datensätze gültige Werte haben, sollte es kein Problem geben? – maddie

+0

Sollte in Ordnung sein, solange Sie Daten speichern, die von Ihrem Konverter korrekt analysiert werden können. Stellen Sie sicher, dass der Konverter Daten speichert, die er analysieren kann, und dass andere Anwendungen, die Zugriff auf die Tabelle haben, Daten im selben Format generieren. –

+0

Ich würde keinen benutzerdefinierten Konverter benötigen, wenn mein Datenbankattribut boolesch ist und das Java-Objektattribut auch boolesch ist, richtig? Oder brauche ich noch einen benutzerdefinierten Konverter? – maddie

0

Annotation ist: @DynamoDBTypeConverted (Konverter = MyBooleanConverter.class)

return Boolean.valueOf (object);

Rest arbeitete für mich.