簡體   English   中英

DynamoDB映射枚舉列表

[英]DynamoDB mapping List of Enum

使用Custom Marshall將枚舉類映射到DynamoDB對象非常簡單。 但是如何映射枚舉列表呢?

恩類

public enum Transport {
SMS,EMAIL,ALL;
}

DynamoDB映射器

public class Campaign{
   private List<Transport> transport;

   @DynamoDBAttribute(attributeName = "transport")
   public List<Transport> getTransport() {
       return transport;
   }

   public void setTransport(List<Transport> transport) {
      this.transport = transport;
   }
}

DynamoDBMarshaller已棄用。 請改用DynamoDBTypeConverter。

例:

恩類

public static enum ValidationFailure {
    FRAUD, GENERAL_ERROR
}

DynamoDBTable類

 @DynamoDBTable(tableName = "receipt")
public class Receipt {

    private Long id;
    private List<ValidationFailure> validation;

    @DynamoDBHashKey(attributeName = "id")
    public Long getId() {
        return id;
    }

    @DynamoDBTypeConverted(converter = ValidationConverter.class)
    public List<ValidationFailure> getValidation() {
        return validation;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setValidation(List<ValidationFailure> validation) {
        this.validation = validation;
    }
}

轉換器:

public class ValidationConverter implements DynamoDBTypeConverter<List<String>, List<ValidationFailure>> {

@Override
public List<String> convert(List<ValidationFailure> object) {
    List<String> result = new ArrayList<String>();
    if (object != null) {
        object.stream().forEach(e -> result.add(e.name()));
    }
    return result;
}

@Override
public List<ValidationFailure> unconvert(List<String> object) {
    List<ValidationFailure> result = new ArrayList<ValidationFailure>();
    if (object != null) {
        object.stream().forEach(e -> result.add(ValidationFailure.valueOf(e)));
    }
    return result;
}
}

它對我有用,我用過Set

@DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.SS)
var roles: MutableSet<Employee.Role>? = null

我認為相同的方法適用於List with DynamoDBAttributeType.L

我自己找到了答案。 我創建了一個如下所示的自定義馬歇爾。

public class TransportMarshaller implements DynamoDBMarshaller<List<Transport>> {

@Override
public String marshall(List<Transport> transports) {
    List<String>transportMap=new ArrayList<>();
    for(Transport transport:transports){
        transportMap.add(transport.name());
    }
    return transportMap.toString().replaceAll("\\[|\\]", "");//Save as comma separate value for the purpose of easiness to unmarshall
}

@Override
public List<Transport> unmarshall(Class<List<Transport>> aClass, String s) {
    List<String>map= Arrays.asList(s.split("\\s*,\\s*")); //split from comma and parse to List
    List<Transport>transports=new ArrayList<>();
    for (String st:map){
        transports.add(Transport.valueOf(st));
    }
    return transports;
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM