【问题标题】:DynamoDB enum conversion version 2DynamoDB 枚举转换版本 2
【发布时间】:2020-10-15 20:08:33
【问题描述】:
【问题讨论】:
标签:
amazon-web-services
amazon-dynamodb
dynamodb-queries
【解决方案1】:
枚举可以通过以下注解进行转换。
@DynamoDbConvertedBy(EnumAttributeConverter.class)
private JobType jobType;
【解决方案2】:
目前,您可以使用包含 DynamoDbConvertedBy 注释的官方 dynamodb-enhanced client 为任何数据类型编写自定义转换器。您可以在此处指定一个转换器类,为您的数据类型实现 AttributeConverter 接口。
下面是我的 Map 类型的转换器实现示例(与任何 POJO 的编写方式相同):
@DynamoDbConvertedBy(EnumMapAttributeConverter.class) 用于实体字段的 getter。
类本身:
public class EnumMapAttributeConverter
implements AttributeConverter<Map<EnumClass, String>> {
@Override
public AttributeValue transformFrom(final Map<EnumClass, String> input) {
Map<String, AttributeValue> attributeValueMap =
input.entrySet().stream()
.collect(
Collectors.toMap(
k -> k.getKey().getValue(),
v -> AttributeValue.builder().s(v.getValue()).build()));
return AttributeValue.builder().m(attributeValueMap).build();
}
@Override
public Map<EnumClass, String> transformTo(final AttributeValue input) {
return input.m().entrySet().stream()
.collect(
Collectors.toMap(
k -> getEnumClassKeyByString(k.getKey()), v -> v.getValue().s()));
}
private EnumClass getEnumClassKeyByString(final String key) {
EnumClass enumClass = EnumClass.getByValue(key);
return enumClass != null ? enumClass : EnumClass.NOT_FOUND;
}
@Override
public EnhancedType<Map<EnumClass, String>> type() {
return EnhancedType.mapOf(EnumClass.class, String.class);
}
@Override
public AttributeValueType attributeValueType() {
return AttributeValueType.M;
}
}