2016-04-28 45 views
11

AWS DynamoDBテーブル内に文字列の配列を格納しようとしています。ほとんどの場合、この配列には少なくとも1つの文字列が設定されます。しかし、配列が空の場合があります。AWS DynamoDBで空のJava文字列を処理する方法

私はDynamoDBモデルをJava Lambda関数で作成しました。このモデルでは、一連の文字列がそのプロパティの1つとして含まれています。文字列のセットが空のときにDynamoDBモデルを保存しようとすると、DynamoDBに空のセットを格納できないというエラーが表示されます。

私の質問は、DynamoDBに保存/更新する前に、モデルから空のときにその設定されたプロパティを削除するのはどうですか?

ここにモデルの例を示します。

@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); 
     } 
    } 
} 

初めてグループを作成します。ユーザーがいないか、1人以上のユーザーがいる可能性があります。

+0

AWSのテクニカルサポートでは、既存のアイテムを実際に削除して、同じプライマリインデックスを持つ新しいアイテムを作成し、nullになるプロパティを残して再作成することをお勧めします。私はこれを試して、それと運がなかった。 –

+0

これは、この種の状況にJava POJOクラスを使用できないことを意味しますか? –

答えて

0

実際の問題が発生したのは、継承したコードに、DynamoDBMapperConfigのSaveBehaviorがUPDATE_SKIP_NULL_ATTRIBUTESに設定されていてnull値をスキップしたため、DynamoDBから絶対削除されないためです。さまざまな保存動作の説明のこの記事を参照してください。 https://java.awsblog.com/post/Tx1MH3BFPW8FX6W/Using-the-SaveBehavior-Configuration-for-the-DynamoDBMapper

もう少し詳しく説明します。

自分のJAVAプロジェクト内にDynamoDBMapperConfig.SaveBehaviorを設定しています。

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

次に、あなたはあなたにも(ヌル)に特定の値を設定する必要が@DynamoDBAttributeマッピングされたモデルを更新するたびに。

user.setFirstName(null) 

これは、DynamoDBエントリから属性を削除することができる最も簡単な方法でした。

1

これはやや古い質問ですが、この問題を解決する方法はカスタムDynamoDBMarshallerです。

@DynamoDBMarshalling注釈を使用して、POJOアクセサメソッドを装飾して、marshallerクラスが文字列のセットを直列化および逆シリアル化するために使用するDynamoDBマッパーに指示することができます。このようにして、特殊なユースケースを制御できます。ここ

は、上記顧客マーシャラー溶液がシリアル化され、データベース内の表現がセット自体ではないので、文字列へ/からデシリアライズもアプローチにlink to an AWS blog post with an example

1回の警告です。しかし、私はそれがあまりにも悪いとは考えていません。

オブジェクトマッパーの代わりにDocument APIを使用すると、項目を完全に制御できます。私はまだ文字列バッキングでカスタムマッパーのために行くだろうが。

+0

ありがとう!私はこれを実装しようとします。 –

関連する問題