在DynamoDB中存储Java枚举的字符串值而不是枚举值本身
问题描述:
我正在使用DynamoDB,并且我想要存储enum
的String
值而不是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类定义属性作为字符串和设计getter
和setter
发送/接收枚举对象(即源)。
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;
}
答
覆盖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; }
}
我已经更新了getType方法来处理null。 – notionquest
我也试过,这种方法的问题是在持久化之前值为'null'时。当它试图从DynamoDB中“查找”实体时会失败。有时'源'可以存在或不存在。如果价值总是没有问题,但对我来说并非如此。 –
getType方法的最新更新应处理Source不在表上的场景。 DynamoDB get应该工作,并且对象应该正确地反序列化。 – notionquest