2017-05-03 8 views
1

私はDynamoDBを使用しています。enumの代わりにのString値を格納します。DynamoDBにenum値の代わりにJava enumのString値を格納します。

たとえば、私はこのenum持っている:

public enum Source { 
    BREACH("breach"), 
    LEAKAGE("leakage"); 

    private final String desc; 

    Source(String desc) { this.desc = desc; } 

    public String desc() { return desc; } 
} 

を...そして、この "実体":@DynamoDBTypeConvertedEnum注釈付き

@DynamoDBTable(tableName = "Alerts") 
public final class Alert implements Serializable { 
    private static final long serialVersionUID = 4012517315640518044L; 

    @DynamoDBHashKey(attributeName = "AlertId") // Partition Key or Hash Attribute 
    private String alertId; 

    @DynamoDBTypeConvertedEnum 
    @DynamoDBAttribute(attributeName = "Source") 
    private Source type; 

    // Constructor(s), Getter(s), Setter(s), ToString, etc... 
} 

、保存されます値はBREACHですが、私欲しいのはbreachです。

{ 
    "AlertId": { "S": "a083168d-cb23-4ec8-ab80-a1c16955c4b8" }, 
    "Source": { "S": "BREACH" }, 
    ... 
    "CreatedAt": { "S": "2017-05-03T14:07:36.395Z" } 
} 

手がかりはありますか?私は "コンバーター"を試してみましたが(完全には動作しませんでしたが)、それぞれが異なるので、enumタイプごとに1つずつ行う必要があります。

答えて

1

あなたはすなわち、文字列としての属性を定義し、列挙オブジェクト(つまりソース)を受信/送信するためにgettersetterを設計し、このようなAlertクラスをコーディングすることができます。

Alertクラス: -

@DynamoDBTable(tableName = "Alerts") 
public final class Alert implements Serializable { 
    private static final long serialVersionUID = 4012517315640518044L; 

    private String alertId; 

    private String type; 

    @DynamoDBHashKey(attributeName = "AlertId") 
    public String getAlertId() { 
     return alertId; 
    } 

    @DynamoDBAttribute(attributeName = "Source") 
    public Source getType() { 
     if (type != null) 
     return Source.valueOf(type); 
     else 
     return null; 
    } 

    public void setAlertId(String alertId) { 
     this.alertId = alertId; 
    } 

    public void setType(Source type) { 
     this.type = type.desc(); 
    } 
} 

アラートの作成: -

格納するデータベース表で期待どおりに値を。 DynamoDBテーブルから項目を取得することもできます。

public Boolean createAlert(String alertId, Source source) { 
    DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(dynamoDBClient); 
    Alert alert = new Alert(); 
    alert.setAlertId(alertId); 
    alert.setType(source); 
    dynamoDBMapper.save(alert); 

    return true; 

} 
+0

nullを処理するようにgetTypeメソッドを更新しました。 – notionquest

+0

私もそれを試しました。このアプローチの問題は、値を永続化する前に値が「null」だった場合です。エンティティをDynamoDBから「検索」しようとすると失敗します。時には 'source'が存在することもあればそうでないこともあります。値が常に存在する場合は問題はありませんが、それは私には当てはまりません。 –

+0

getTypeメソッドの最新の更新は、Sourceがテーブルに存在しないシナリオを処理する必要があります。 DynamoDB getが機能し、オブジェクトを適切にデシリアライズする必要があります。 – notionquest

0

オーバーライドtoString()これはうまくいくはずです。

public enum Source { 

    BREACH("breach"), 
    LEAKAGE("leakage"); 

    private final String desc; 

    Source(String desc) { this.desc = desc; } 

    public String desc() { return desc; } 

    @Override 
    public String toString() { return desc; } 
} 
関連する問題