在DynamoDB中存储Java枚举的字符串值而不是枚举值本身

问题描述:

我正在使用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类型做一个,因为它们都是不同的。

可以编码这样即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

覆盖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; } 
}