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

Kir*_*ran 10 java spring amazon-dynamodb spring-boot

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

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

例如。

我的模型类是:

@DynamoDBTable(tableName = "dev_users")
public class User {
Run Code Online (Sandbox Code Playgroud)

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

@Value("${DOCKER_ENV:dev}")
Run Code Online (Sandbox Code Playgroud)

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

我的意图是这样使用:

在此处输入图片说明

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

编辑1:

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

过程:

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

在此处输入图片说明

  • 对于 1) 我已经替换了“表名覆盖 bean 注入”以避免错误。
  • 对于 2) 我打印了传递给此方法的名称。但它是空的。所以在这里检查所有可能的传递值的方法。

检查图像是否有错误:

在此处输入图片说明

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

我在这里缺少什么?

Rah*_*war 7

可以通过更改的 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);
}
Run Code Online (Sandbox Code Playgroud)

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