如何替换不推荐使用的构造函数DynamoDBMapperFieldModel

时间:2019-08-29 10:34:40

标签: java amazon-dynamodb

最近,我必须维护一个用Java开发的旧项目(这不是我的专长),并且在编译过程中收到有关过时API的警告。

经过调查,我发现不推荐使用的API是AWS的构造函数DynamoDBMapperFieldModel。 查看文档后,我没有找到有关新构造函数或如何通过另一种方式实例化它的任何信息。 我需要这个构造函数,因为我的课程正在实现ItemConverter和方法getFieldModel

下面您将找到我班上的那段代码:

    @Override
    public DynamoDBMapperFieldModel getFieldModel(Method getter) {

        MethodInfo fieldMeta = meta.get(getter.getDeclaringClass()).get(getter);
        return new DynamoDBMapperFieldModel(getter.toString(), fieldMeta.dynamoDBAttributeType, fieldMeta.marshaller);
    }

SDK的版本如下: com.amazonaws:aws-java-sdk-dynamodb:1.9 com.amazonaws:aws-java-sdk:1.11.15

如果您有任何疑问,请告诉我,谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

免责声明:我的回答基于对DynamoDBMapperFieldModel版本1.11.15 found here中的源代码的检查。我从未使用过此API,因此,由于没有其他答案,我的答案更像是提供的见解。

除了上述deprecated构造函数之外,类DynamoDBMapperFieldModel还提供以下内容:

/**
 * Creates a new field model instance.
 * @param builder The builder.
 */
private DynamoDBMapperFieldModel(final Builder<T,V> builder) {
    this.id = builder.id;
    this.properties = builder.properties;
    this.reflect = builder.reflect;
    this.converter = builder.converter;
    this.dynamoDBAttributeType = builder.dynamoDBAttributeType;
}

但是,此构造函数为private,这意味着您不能直接从类范围之外调用它。看来解决方案是使用DynamoDBMapperFieldModel.Builder静态内部类实例化DynamoDBMapperFieldModel对象。 class com.amazonaws.services.dynamodbv2.datamodeling.ConversionSchemas包含该惯用语的一些示例性示例,例如:

@Override
public DynamoDBMapperFieldModel getFieldModel(Method getter) {
    //...
    final StandardAnnotationMaps.FieldMap annotations = StandardAnnotationMaps.of(getter, null);
    final DynamoDBMapperFieldModel.Builder builder = new DynamoDBMapperFieldModel.Builder(void.class, annotations);
    builder.with(attributeType);
    return builder.build();
}

这个习惯用法很常见,通常称为Builder Pattern

值得注意的是,DynamoDBMapperFieldModel.Builder内部类具有“默认可见性”(没有显式访问修饰符):

static final class Builder<T,V> {
    //...
}

必要时,您可以检查this tutorial以了解每个可见性修饰符的限制。

希望这可以帮助您找到最终的解决方案。