2017-05-03 116 views
1

我正在使用DynamoDB,並且我想要存儲enumString值而不是enum本身。在DynamoDB中存儲Java枚舉的字符串值而不是枚舉值本身

舉例來說,我有這個enum

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

    private final String desc; 

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

    public String desc() { return desc; } 
} 

......而這個 「實體」:

@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... 
} 

隨着@DynamoDBTypeConvertedEnum註解,即會保存爲BREACH的價值,但我想要breach

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

任何線索?我確實嘗試過「轉換器」(不完全,我不能使它工作,但我認爲我必須最終爲每個enum類型做一個,因爲它們都是不同的。

回答

1

可以編碼這樣即Alert類定義屬性作爲字符串和設計gettersetter發送/接收枚舉對象(即源)。

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

我已經更新了getType方法來處理null。 – notionquest

+0

我也試過,這種方法的問題是在持久化之前值爲'null'時。當它試圖從DynamoDB中「查找」實體時會失敗。有時'源'可以存在或不存在。如果價值總是沒有問題,但對我來說並非如此。 –

+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; } 
}