【问题标题】:How to pass aws dynamodb table name dynamically using @DynamoDbTable annotation如何使用 @DynamoDbTable 注释动态传递 aws dynamodb 表名
【发布时间】:2020-12-06 21:06:03
【问题描述】:

我创建了一个 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 服务出错

构造函数 DynamoDBMapper(DynamoDB, DynamoDBMapperConfig) 未定义

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

【问题讨论】:

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


    【解决方案1】:

    DynamoDBMapper 期望 AmazonDynamoDB 的任何实现,但不是 DynamoDB 类。

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

    您只需在服务中注入 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.  
    

    【讨论】:

    • 在我的情况下,它需要在我的@EnableDynamoDBRepositories 中指定具有覆盖的映射器。所以它应该像@EnableDynamoDBRepositories(basePackages = "&lt;your repo package&gt;", amazonDynamoDBRef = "&lt;name of your AmazonDynamoDB bean&gt;", dynamoDBMapperRef = "dynamoDBMapper")。否则,回购将寻找另一个(默认)映射器而不覆盖策略。希望它会帮助某人
    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    相关资源
    最近更新 更多