2016-04-28 4 views
11

Ich versuche, ein Array von Zeichenfolgen innerhalb einer AWS DynamoDB-Tabelle zu speichern. In den meisten Fällen wird dieses Array mit mindestens einer Zeichenfolge gefüllt. Es gibt jedoch den Fall, dass das Array leer sein könnte.Wie handle ich mit einem leeren Java-Satz von Zeichenfolgen in AWS DynamoDB

Ich habe ein DynamoDB-Modell in einer Java-Lambda-Funktion erstellt, die eine Reihe von Zeichenfolgen als eine ihrer Eigenschaften enthält. Wenn ich versuche, ein DynamoDB-Modell zu speichern, wenn die Menge der Zeichenfolgen leer ist, gibt es eine Fehlermeldung, dass ich in DynamoDB keine leere Menge speichern kann.

Also meine Frage ist, wie würde das Entfernen dieser Set-Eigenschaft, wenn es leer ist von meinem Modell behandeln, bevor ich es in der DynamoDB speichern/aktualisieren?

Hier ist ein Beispiel für das Modell.

@DynamoDBTable(tableName = "group") 
public class Group { 
    private String _id; 
    private Set<String> users; 

    @Null 
    @DynamoDBHashKey 
    @DynamoDBAutoGeneratedKey 
    public String getId() { 
     return _id; 
    } 

    public void setId(final String id) { 
     _id = id; 
    } 

    @DynamoDBAttribute 
    public Set<String> getUsers(){ 
     return users; 
    } 

    public void setUsers(final Set<String> users) { 
     this.users = users; 
    } 

    public void addUser(String userId) { 
     if(this.users == null){ 
      this.setUsers(new HashSet<String>(Arrays.asList(userId))); 
     }else{ 
      this.getUsers().add(userId); 
     } 
    } 
} 

Das erste Mal, wenn ich eine Gruppe erstellen werde. Es könnte keinen Benutzer haben, oder es könnte einen oder mehrere Benutzer haben.

+0

Basierend auf weiteren Gesprächen, die ich in Bezug auf diese mit AWS technischen Support hatte, klingt es nach der akzeptierten Praxis, das vorhandene Element tatsächlich zu löschen und ein neues Element mit dem gleichen Primärindex neu zu erstellen. Ich habe das versucht und hatte kein Glück damit. –

+0

Das bedeutet, dass wir keine Java-POJO-Klasse für diese Art von Situation verwenden können? –

Antwort

0

Wenn es um das eigentliche Problem ging, war, weil der Code, den ich geerbt hatte das SaveBehavior auf der DynamoDBMapperConfig auf UPDATE_SKIP_NULL_ATTRIBUTES gesetzt, die Nullwerte überspringt und daher nie aus DynamoDB entfernen. In diesem Beitrag finden Sie Erklärungen zu den verschiedenen Speicherverhaltensweisen. https://java.awsblog.com/post/Tx1MH3BFPW8FX6W/Using-the-SaveBehavior-Configuration-for-the-DynamoDBMapper

Um dies ein wenig weiter zu vertiefen.

Ich setze meine DynamoDBMapperConfig.SaveBehavior als solche in meinem JAVA-Projekt.

_dynamoDBMapperConfig = new DynamoDBMapperConfig.Builder() .withSaveBehavior(SaveBehavior.UPDATE) .withTableNameResolver(TABLE_NAME_RESOLVER) .withConversionSchema(ConversionSchemas.V2) .build();

Dann, wenn Sie ein Modell aktualisieren, die ein zugeordnetes @DynamoDBAttribute haben Sie müssen auch den besonderen Wert (null) setzen.

user.setFirstName(null) 

Dies war der einfachste Weg, um Attribute aus einem DynamoDB Entry zu entfernen.

1

Dies ist eine alte Frage, aber die Art, wie ich dieses Problem lösen würde, ist mit einem benutzerdefinierten DynamoDBMarshaller.

Mithilfe der @DynamoDBMarshalling Annotation können Sie die POJO-Zugriffsmethoden dekorieren, um dem DynamoDB-Mapper zu bestimmen, welche Marshaller-Klasse verwendet werden soll, um die Zeichenketten zu serialisieren und zu deserialisieren. So haben Sie die Kontrolle über die speziellen Anwendungsfälle.

Hier ist auch eine link to an AWS blog post with an example

Die einzige Einschränkung mit dem obigen Ansatz ist die Kunde Einweiser Lösung serialisiert und deserialisiert zu/von String, so dass die Darstellung nicht in der Datenbank ein Satz per se sein würde. Das halte ich jedoch nicht für schlecht.

Ein anderer Ansatz könnte die Verwendung der Document API anstelle der Objekt-Mapper sein, die Ihnen die volle Kontrolle über die Elemente gibt. Obwohl ich immer noch für benutzerdefinierte Mapper mit String-Backing gehen würde.

+0

Danke!Ich werde versuchen, dies zu implementieren. –

Verwandte Themen