如何动态更改使用DynamoDB的Java Mapper访问的表?

时间:2016-04-01 03:57:16

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

我有一些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的位置,但我还没有找到任何线索。]

1 个答案:

答案 0 :(得分:14)

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

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