java - 如何在 spring boot 中使用环境变量动态设置 tableName?

标签 java spring spring-boot amazon-dynamodb

我正在使用 AWS ECS 托管我的应用程序并使用 DynamoDB 进行所有数据库操作。因此,对于不同的环境,我将拥有具有不同表名的相同数据库。比如"dev_users"(for Dev env),"test_users"(for Test env)等。(我们公司是这样用同一个Dynamo账号来对应不同环境的)

所以我想使用通过“AWS ECS 任务定义”环境参数传递的环境变量更改模型类的“tableName”。

例如。

我的模型类是:

@DynamoDBTable(tableName = "dev_users")
public class User {

现在,当我在测试环境中部署容器时,我需要将“dev”替换为“test”。我知道我可以使用

@Value("${DOCKER_ENV:dev}")

访问环境变量。但我不确定如何在类外使用变量。有什么方法可以使用 docker env 变量来选择我的表前缀吗?

我的意图是这样使用:

enter image description here

我知道这是不可能的。但是还有其他方法或解决方法吗?

编辑 1:

我正在研究 Rahul 的答案并面临一些问题。在写问题之前,我将解释我遵循的过程。

过程:

  1. 我已经在我的配置类 (com.myapp.users.config) 中创建了 bean。
  2. 因为我没有存储库,所以我将我的模型类包名称指定为“basePackage”路径。 (请检查图片)

enter image description here

  • 对于 1) 我已经替换了“表名 over-rider bean 注入(inject)”以避免错误。
  • 对于 2) 我打印了传递给此方法的名称。但它是空的。因此,检查所有可能的方式来传递值。

检查图像是否有错误:

enter image description here

我没有更改我的用户模型类中的任何内容,因为当执行 bean 时,bean 将替换 DynamoDBTable 的名称。但是表名覆盖正在发生。数据仅从模型类级别给出的表名中提取。

我在这里缺少什么?

最佳答案

可以通过更改的 DynamoDBMapperConfig bean 更改表名。

对于您必须为每个表加上文字前缀的情况,您可以这样添加 bean。这里的前缀可以是您的环境名称。

 @Bean
public TableNameOverride tableNameOverrider() {
    String prefix = ... // Use @Value to inject values via Spring or use any logic to define the table prefix
    return TableNameOverride.withTableNamePrefix(prefix);
}

有关更多详细信息,请在此处查看完整的详细信息: https://github.com/derjust/spring-data-dynamodb/wiki/Alter-table-name-during-runtime

关于java - 如何在 spring boot 中使用环境变量动态设置 tableName?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51262542/

相关文章:

java - Android lollipop 5.0 上的工具栏阴影问题

java - 将文本文件插入 Map<Integer, Map<Integer, Double>>

Java Spring - 仅保存(POST)来自 ManyToOne 关系的 id

spring-boot - 从 Grails 3 迁移到 Spring-Boot

java - 无法使用 mapstruct 将 List<Source> 映射到 List<Target>

java - 如何在 Java 中生成随机字符串

java - 想要一个带有透明背景图像的 JLabel

java - Spring + hibernate : Expected type: java. util.SortedSet,实际值: org. hibernate.collection.internal.PersistentSet

spring - 使用 spring3 @Value 访问 PropertyPlaceholderConfigurer 值?

java - Flyway 与 spring boot 的集成不会在嵌入式 H2 数据库上执行迁移脚本