Как динамически передать имя таблицы aws Dynamodb с помощью аннотации @DynamoDbTable

Я создал 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) не определен

Я не могу понять, в чем проблема. Если я использую имя таблицы в файле класса, он работает нормально, если я пытаюсь заменить имя таблицы с помощью кода, это заканчивается ошибкой.


person Mohan vel    schedule 17.08.2020    source источник


Ответы (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.  
person Traycho Ivanov    schedule 17.08.2020