DynamoDBMapperFieldModel

DynamoDBMapperFieldModel

最近,我必须维护一个用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.11.15版本found hereDynamoDBMapperFieldModel源代码的检查。我从来没有使用过此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以了解每个可见性修饰符的限制。

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

关于java - 如何替换不推荐使用的构造函数DynamoDBMapperFieldModel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57708294/

10-11 10:45