【问题标题】:DynamoDB enum conversion version 2DynamoDB 枚举转换版本 2
【发布时间】:2020-10-15 20:08:33
【问题描述】:

我正在迁移到 AWS java sdk 到版本 2,以改善不常用的 lambdas 的冷启动。

在版本 1.x 中,我使用 @DynamoDBTypeConvertedEnum 来注释枚举并使用 @DynamoDBDocument 来存储嵌套对象。我怎么能做到这一点,我不想更改存储在表中的数据。

https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/client-configuration-starttime.html

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>dynamodb</artifactId>
 </dependency>
 <dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>dynamodb-enhanced</artifactId>
 </dependency>

【问题讨论】:

    标签: 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;
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 2021-01-04
        • 2023-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        相关资源
        最近更新 更多