java - 如何使用 @DynamoDbTable 注释动态传递 aws dynamodb 表名称

标签 java spring-boot amazon-dynamodb aws-java-sdk-2.x aws-java-sdk-dynamodb

我创建了一个 java 服务来从 dynamodb 获取详细信息,它工作正常,但我的挑战是我将表名称硬编码到类文件 @DynamoDbTable 注释中,以便在不同的环境中工作感觉这不是正确的方法。我在下面给出了我的代码,有人可以帮助我解决这个问题。

代码示例

public class DynamodbService {

    private DynamoDB client;
    private DynamoDBMapper objectMapper;

    /**
     * 
     * @param client
     * @param objectMapper
     */
    @Autowired
    public DynamodbService(DynamoDB client, DynamoDBMapper objectMapper) {
        this.client = client;
        this.objectMapper = objectMapper;
    }


    public List<Dynamodb> findAll() throws Exception {
        DynamoDBMapperConfig mapperConfig = new DynamoDBMapperConfig.Builder()
                .withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(""))
                .build();
        DynamoDBMapper mapper = new DynamoDBMapper(client, mapperConfig);

        DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();

        List<Dynamodb> scanResult = objectMapper.scan(Dynamodb.class, scanExpression);
        return scanResult;
    }

}

我的 DynamoDB 配置

@Configuration
public class DynamoDBconfig {
    /**
     * 
     */
    @Value("${amazon.dynamodb.accesskey}")
    private String awsAccessKey;
    /**
     * 
     */
    @Value("${amazon.dynamodb.secretkey}")
    private String awsSecretKey;

    
    @Bean
    public AWSCredentials amazonAWSCredentials() {
        return new BasicAWSCredentials(aes.getDecryptedvalue(awsAccessKey), aes.getDecryptedvalue(awsSecretKey));
    }

    /**
     * 
     * @return
     */
    @Bean
    public DynamoDBMapperConfig dynamoDBMapperConfig() {
        return DynamoDBMapperConfig.DEFAULT;
    }

    /**
     * 
     * @param amazonDynamoDB
     * @param config
     * @return
     */
    @Bean
    public DynamoDBMapper dynamoDBMapper(AmazonDynamoDB amazonDynamoDB, DynamoDBMapperConfig config) {
        return new DynamoDBMapper(amazonDynamoDB, config);
    }

    /**
     * 
     * @return
     */
    @Bean
    public AmazonDynamoDB amazonDynamoDB() {
        return AmazonDynamoDBClientBuilder.standard().withCredentials(amazonAWSCredentialsProvider())
                .withRegion(Regions.US_EAST_2).build();
    }

    /**
     * 
     * @return
     */
    @Bean
    public DynamoDB dynamoDB() {
        return new DynamoDB(amazonDynamoDB());
    }

    /**
     * 
     * @return
     */
    public AWSCredentialsProvider amazonAWSCredentialsProvider() {
        return new AWSStaticCredentialsProvider(amazonAWSCredentials());
    }

}

我的 dynamodb 服务出现错误

The constructor DynamoDBMapper(DynamoDB, DynamoDBMapperConfig) is undefined

我无法找出问题所在。如果我在类文件中使用表名,则工作正常,如果我尝试使用代码替换表名,则会出现错误。

最佳答案

DynamoDBMapper 需要 AmazonDynamoDB 的任何实现,但不需要 DynamoDB 类。

public DynamoDBMapper(
            final AmazonDynamoDB dynamoDB,
            final DynamoDBMapperConfig config) {

您只需在服务中注入(inject) DynamoDBMapper。

@Bean
public DynamoDBMapper dynamoDBMapper(AmazonDynamoDB amazonDynamoDB) {
  DynamoDBMapperConfig config = new DynamoDBMapperConfig.Builder().withTableNameOverride(TableNameOverride.withTableNameReplacement(tableName))
        .build();
   return new DynamoDBMapper(amazonDynamoDB, config);
}

其他选项可以使用 com.amazonaws.services.dynamodbv2.document.DynamoDB 类,但您无法使用 DynamoDBScanExpression 并且需要重写代码。


String desiredTabledName = "table-name";
Table table = dynamoDB.getTable(desiredTabledName);


You have multiple options.

 - table.scan() and table query.
 - Index index = table.getIndex(indexName);
   index.scan() or index.query()
 - You could pass `QuerySpec` and `ScanSpec` to all above.  

关于java - 如何使用 @DynamoDbTable 注释动态传递 aws dynamodb 表名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63455756/

相关文章:

Java轻松快速地创建实例getter

java - 如何为 Paint.setTextSize() 设置单位

tomcat - Spring 启动: Send requests on another port to a custom Servlet

java - Spring Boot 测试 - 创建名为 SpringBootRepositoryRestMvcConfiguration 的 bean 时出错

java - Spark Streaming作业如何在Kafka主题上发送数据并将其保存在Elastic中

node.js - 如何使用 Jest 在 Nodejs 中模拟 Amazon DynamoDB v3?

java - 在线和/或讲师指导的培训 - Grails

java - 等待递归线程生产者

amazon-web-services - 如何拥有两个以上触发 lambda 的 DynamoDB 流

amazon-web-services - 如何设计 DynamoDB 表架构