【问题标题】:How do I dynamically change the table accessed using DynamoDB's Java Mapper?如何动态更改使用 DynamoDB 的 Java Mapper 访问的表?
【发布时间】:2016-07-20 18:07:35
【问题描述】:

我有几个 DynamoDB 表,所有这些表都具有相同结构的条目。我想创建一个 POJO 来表示所有这些条目,然后使用 DynamoDB 的 Mapper API 来加载和保存这些对象。

问题是 API 需要我的 POJO 上的注解 @DynamoDBTable。这是一个编译时注释,需要一个表名参数,因此会阻止我以动态方式使用 POJO。 DynamoDBMapperConfig 似乎旨在允许这种动态行为变化。不幸的是,它对我不起作用:我收到一个客户端 DDB 错误,说我的 POJO 验证失败,因为我在注释中放入了空字符串。

我反复寻找为什么我的 DynamoDBMapperConfig 没有得到尊重,但找不到任何东西。我的代码如下,精简到基本要素:

我的 POJO:

@DynamoDBTable(tableName = "") // table name must be overridden on each call
public class TableEntry {
    . . .
}

我的客户:

public class MyMapper {
    private final DynamoDBMapper mapper;
    private final DynamoDBMapperConfig configs;

    public MyMapper(String tableName) {
        AmazonDynamoDBClient client = . . .;
        mapper = new DynamoDBMapper(client);
        configs = new DynamoDBMapperConfig.Builder()
            .withTableNameOverride(TableNameOverride.withTableNameReplacement(tableName))
            .build();
    }

    . . .

    public void getEntry(String key) {
        return mapper.load(TableEntry.class, key, configs);
    }
}

当我运行我的代码(与我在此处粘贴的基本相似)时,我收到以下消息:

2 validation errors detected: Value '' at 'tableName' failed to satisfy constraint: . . .

接着说 (1) 表名太短和 (2) 表名与其正则表达式模式不匹配。

关于我的动态命名表无法与 DynamoDB Mapper API 一起使用的任何建议?非常感谢文档参考。

[我找到了 DynamoDBMapper retrieves the table name 的位置,但我还没有找到任何线索。]

【问题讨论】:

    标签: java amazon-web-services amazon-dynamodb


    【解决方案1】:

    DynamoDBMapperConfig 不是静态/全局类。您需要将其传递给DynamoDBMapper 构造函数。

        AmazonDynamoDBClient client = . . .;
        mapperConfig = new DynamoDBMapperConfig.Builder().withTableNameOverride(TableNameOverride.withTableNameReplacement(tableName))
            .build();
        mapper = new DynamoDBMapper(client, mapperConfig);
    

    【讨论】:

    • 您似乎部分正确:我应该在构造函数中传递我的配置以使其更清洁。但是构造函数的文档说:“config - 用于所有服务调用的默认配置。它可以在每个操作的基础上被覆盖。”当我发出实际的获取请求时,我会覆盖它: return mapper.load(TableEntry.class, key, configs);
    • 或者更好的是,使用 withTableNameResolver 而不是覆盖和“功能”来确定每次使用的正确表名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多