如何动态更改使用DynamoDB访问的表';什么是Java映射器?

如何动态更改使用DynamoDB访问的表';什么是Java映射器?,java,amazon-web-services,amazon-dynamodb,Java,Amazon Web Services,Amazon Dynamodb,我有几个DynamoDB表,它们都有相同结构的条目。我想创建一个POJO来表示所有这些条目,然后使用DynamoDB的mapperapi来加载和保存这些对象 问题是API需要在我的POJO上使用注释@DynamoDBTable。这是一个编译时注释,需要一个表名参数,因此我无法以动态方式使用POJO。似乎是为了允许这样的动态行为改变。不幸的是,它对我不起作用:我收到一个客户端DDB错误,说我的POJO验证失败,因为我在注释中输入了空字符串 我已经反复寻找为什么我的DynamoDBMapperCon

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

问题是API需要在我的POJO上使用注释
@DynamoDBTable
。这是一个编译时注释,需要一个表名参数,因此我无法以动态方式使用POJO。似乎是为了允许这样的动态行为改变。不幸的是,它对我不起作用:我收到一个客户端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映射器API一起工作,有什么建议吗?非常感谢文档参考


[我已经找到了DynamoDBMapper的位置,但还没有找到任何线索。]

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

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

你似乎有一部分是对的:我应该在构造函数中传递我的配置,使它更干净。但是构造函数的文档中说:“config——用于所有服务调用的默认配置。它可以在每个操作的基础上被重写。”当我发出实际的get请求时,我会重写它:return mapper.load(TableEntry.class,key,configs);或者更好的方法是,使用
和TableNameResolver
而不是覆盖和“功能性”确定每次要使用的正确表名。