【问题标题】:DynamoDB Mapper Type Conversion with Boolean使用布尔值进行 DynamoDB 映射器类型转换
【发布时间】:2020-10-17 07:34:51
【问题描述】:

我有一个成员字段,使用 DynamoDB Java Mapper 转换时遇到问题。

@DynamoDBTypeConverted(converter = MyEnumBooleanConverter.class)
@DynamoDBAttribute(attributeName = "enumMap")
private Map<MyEnum, Boolean> enumMap;

MyEnumBooleanConverter 看起来像:

public class MyEnumBooleanConverter implements
        DynamoDBTypeConverter<Map<String, Boolean>, Map<MyEnum, Boolean>> {

    @Override
    public Map<String, Boolean> convert(Map<MyEnum, Boolean> unconvertedMap) {
        return CollectionUtils.emptyIfNull(unconvertedMap.entrySet()).stream()
                .collect(Collectors.toMap(entry -> entry.getKey().toString(), Map.Entry::getValue));
    }

    @Override
    public Map<MyEnum, Boolean> unconvert(Map<String, Boolean> convertedMap) {
        return CollectionUtils.emptyIfNull(convertedMap.entrySet()).stream().collect(Collectors.toMap(
                entry -> MyEnum.valueOf(entry.getKey()), Map.Entry::getValue));
    }
}

转换器序列化一切正常,但是当我进行更新时,它会将我的映射从 BOOL 转换为 N 并以这种方式保存。

有什么方法可以确保我的自定义 DynamoDBTypeConverter 保持 DynamoDB BOOL 类型?我只看到 @DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.BOOL) 字段注释,但不是自定义转换器。

我希望有人之前使用布尔值创建了一个自定义转换器并遇到了这个问题。让我知道您是否可以提供帮助!

只是一些额外的细节: 翻看源码,貌似最终还是使用了V2CompatibleBool AbstractRule,而不是NativeBool规则。

【问题讨论】:

    标签: java amazon-dynamodb


    【解决方案1】:

    我能够通过将 DynamoDBMapperConfig 与 ConversionSchema V2 结合使用来解决此问题。但是,我仍然想知道是否有办法在不更改默认转换架构的情况下做到这一点。

    DDB 中有 3 个 ConversionSchema,V1、V2_Compatible 和 V2。 V2 默认将所有布尔值更改为 BOOL。 V2_Compatible 将它们转换为 N 并且是默认的转换模式。因此,转换器在没有 @DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.BOOL) 注释的情况下采用 BOOL 并将其更改为 N。但仍不清楚如何将此注释应用于自定义转换器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-17
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多