[英]DynamoDB mapping List of Enum
Mapping an enum class in to DynamoDB object is really simple by using Custom Marshall. 使用Custom Marshall将枚举类映射到DynamoDB对象非常简单。 But how to map a List of Enum?
但是如何映射枚举列表呢?
Enum class 恩类
public enum Transport {
SMS,EMAIL,ALL;
}
DynamoDB mapper 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 is deprecated. DynamoDBMarshaller已弃用。 Use DynamoDBTypeConverter instead.
请改用DynamoDBTypeConverter。
Example: 例:
Enum class 恩类
public static enum ValidationFailure {
FRAUD, GENERAL_ERROR
}
DynamoDBTable class 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;
}
}
Convertor: 转换器:
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;
}
}
It's working for me, I have used the Set 它对我有用,我用过Set
@DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.SS)
var roles: MutableSet<Employee.Role>? = null
I think the same approach would work for List with DynamoDBAttributeType.L 我认为相同的方法适用于List with DynamoDBAttributeType.L
I found the answer myself. 我自己找到了答案。 I create a custom marshall like below.
我创建了一个如下所示的自定义马歇尔。
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.