我正在使用 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/