首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Java enum的字符串值而不是枚举值本身存储在DynamoDB中

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

Stack Overflow用户
提问于 2017-05-04 04:46:24
回答 2查看 4.7K关注 0票数 4

我使用的是DynamoDB,并且我希望存储enumString值,而不是enum本身。

例如,我有这个enum

代码语言:javascript
复制
public enum Source {
  BREACH("breach"),
  LEAKAGE("leakage");

  private final String desc;

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

  public String desc() { return desc; }
}

...and这个“实体”:

代码语言:javascript
复制
@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

代码语言:javascript
复制
{
  "AlertId": { "S": "a083168d-cb23-4ec8-ab80-a1c16955c4b8" },
  "Source": { "S": "BREACH" },
  ...
  "CreatedAt": { "S": "2017-05-03T14:07:36.395Z" }
}

有什么线索吗?我确实尝试了“转换器”(不是完全的,虽然我不能让它工作),但我认为我必须为每个enum类型做一个,因为它们都是不同的。

EN

回答 2

Stack Overflow用户

发布于 2017-05-04 05:36:37

您可以这样编写Alert类的代码,即将属性定义为字符串,并设计gettersetter来发送/接收枚举源对象(即)。

警报类:-

代码语言:javascript
复制
    @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();
    }
}

创建警报:-

按照预期将值存储在数据库表中。get item from DynamoDB表也可以正常工作。

代码语言:javascript
复制
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;

}
票数 1
EN

Stack Overflow用户

发布于 2018-02-15 04:10:44

覆盖toString()这应该是可行的。

代码语言:javascript
复制
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; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43769707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档