在DynamoDB中存储Java枚举的String值而不是枚举值本身

时间:2017-05-03 20:46:24

标签: java persistence amazon-dynamodb

我正在使用DynamoDB,我希望存储enum的{​​{1}}值,而不是String本身。

例如,我有enum

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" } } 类型做一个,因为它们都是不同的。

2 个答案:

答案 0 :(得分:1)

您可以像这样对Alert类进行编码,即将属性定义为String并设计appUsergetter来发送/接收枚举对象(即Source)。< / p>

警报类: -

setter

创建提醒:

在数据库表上按预期存储值。 DynamoDB表中的get项也可以正常工作。

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

答案 1 :(得分: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; }
}