java - 使用环境变量 spring boot 在 dynamo db 中动态设置全局二级索引名称

标签 java spring-boot amazon-dynamodb

我正在使用 derjust/spring-data-dynamodb与 DynamoDB 交互的库。我已经定义了一个类 Product 如下:

@DynamoDBTable(tableName = "product")
public class Product {

    @Id
    @NotNull
    @DynamoDBHashKey
    private String productId;

    @DynamoDBIndexHashKey(globalSecondaryIndexName = "product-category-gsi")
    private String categoryId;

    private double amount;

    // more fields, getters and setters    
}

我想在多个环境中使用相同的代码 - dev, staging, prod .因此,表名将是 dev-product, staging-product and prod-product .

该环境可用作应用程序属性。我已经使用这里提到的步骤配置了表名:https://github.com/derjust/spring-data-dynamodb/wiki/Alter-table-name-during-runtime
@Configuration
@EnableDynamoDBRepositories(basePackages = "com.example.entity",dynamoDBMapperConfigRef = "dynamoDBMapperConfig")
public class DynamoDBConfiguration {

    @Value("${aws.region}")
    private String awsRegion;

    @Value("${env.name}")
    private String envName;

    @Bean
    public AmazonDynamoDB amazonDynamoDB() {
        return AmazonDynamoDBClientBuilder.standard()
            .withRegion(awsRegion)
            .build();
    }

    @Bean
    public DynamoDBMapperConfig.TableNameOverride tableNameOverrider() {
        return DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(envName + "-product");
    }

    @Bean
    public DynamoDBMapperConfig dynamoDBMapperConfig() {
        DynamoDBMapperConfig.Builder builder = new DynamoDBMapperConfig.Builder();
        builder.setTableNameOverride(tableNameOverrider());
        return new DynamoDBMapperConfig(DynamoDBMapperConfig.DEFAULT, builder.build());
    }
}

但是如何覆盖全局二级索引名称?目前,我已将其硬编码为“product-category-gsi”。

我希望能够动态设置它,就像我将表名设置为 dev-product-category-gsi, staging-product-category-gsi and prod-product-category-gsi 一样.

最佳答案

您可以为 globalSecondaryIndexName 创建一个常量带有环境名称,

public class DynamoDBConstants {
    public static final String GLOBAL_SECONDARY_INDEXNAME = System.getProperty("env.name")+"product-category-gsi";
}

并按如下方式使用它,
@DynamoDBIndexHashKey(globalSecondaryIndexName = DynamoDBConstants.GLOBAL_SECONDARY_INDEXNAME)
private String categoryId;

关于java - 使用环境变量 spring boot 在 dynamo db 中动态设置全局二级索引名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60808538/

相关文章:

java - 如何测试和模拟mapstruct转换器?

java - 将结果集存储到数组中

java - 安卓工作室Java : Cannot resolve symbol override

docker - 微服务无法访问Docker Compose上的Config Server

java - 错误无法检测 ServletContainerInitializers Tomcat 8

java - 如何在事务开始之前或提交之前执行操作?

python-3.x - 如果您使用 AttributesToGet 参数在 DynamoDB 上运行扫描,您是否需要为每个项目的数据占用量付费,还是只为请求的属性付费?

node.js - 如何从 NodeJS 和 Lambda 对 EMR Hive 运行查询

java - 批量写入 DynamoDB [Java]

java - jBehave 写通用步骤