当前位置: 首页 > 知识库问答 >
问题:

如何在Spring引导中使用环境变量动态设置tableName?

单于皓轩
2023-03-14

我使用AWS ECS来托管我的应用程序,并使用DynamoDB进行所有数据库操作。因此,我将为不同的环境使用相同的数据库和不同的表名。如dev_users(Dev env)、test_users(Test env)等。(这是我们公司如何在不同环境下使用相同的Dynamo帐户)

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

例如

我的模型类是:

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

现在,当我在测试环境中部署容器时,我需要用“测试”替换“开发”。我知道我可以用

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

访问环境变量。但我不知道如何在课堂之外使用变量。有没有办法使用docker env变量来选择我的表前缀?

我的意图是这样使用:

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

编辑1:

我正在研究拉胡尔的答案,并面临一些问题。在撰写这些问题之前,我将解释我遵循的流程。

过程:

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

  • 1)为了避免这个错误,我已经替换了“表名优于rider bean注入”

检查图像是否有错误:

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

我错过了什么?

共有3个答案

林华皓
2023-03-14

我能够实现以活动配置文件名为前缀的表名。

首先添加了TableNameResolver类,如下所示,

@Component
public class TableNameResolver extends DynamoDBMapperConfig.DefaultTableNameResolver {

private String envProfile;

public TableNameResolver() {}

public TableNameResolver(String envProfile) {
    this.envProfile=envProfile;
}

 @Override
 public String getTableName(Class<?> clazz, DynamoDBMapperConfig config) {
  String stageName = envProfile.concat("_");
  String rawTableName = super.getTableName(clazz, config);
  return stageName.concat(rawTableName);
 }
}

然后我设置DynamoDBMapper bean,如下所示,

@Bean
@Primary
public DynamoDBMapper dynamoDBMapper(AmazonDynamoDB amazonDynamoDB) {

    DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDB,new DynamoDBMapperConfig.Builder().withTableNameResolver(new TableNameResolver(envProfile)).build());
     return mapper;
}

添加变量envProfile,它是从application.properties文件访问的活动配置文件属性值。

@Value("${spring.profiles.active}")
private String envProfile;
姜嘉良
2023-03-14

对于在运行时更改表名的需要,我们也有同样的问题。我们使用的是Spring data dynamodb 5.0.2,下面的配置似乎提供了我们需要的解决方案。

首先我注释了我的bean访问器

@EnableDynamoDBRepositories(dynamoDBMapperConfigRef = "getDynamoDBMapperConfig", basePackages = "my.company.base.package")

我还设置了一个名为ENV_PREFIX的环境变量,它是通过SpEL连接的Spring。

@Value("#{systemProperties['ENV_PREFIX']}")
private String envPrefix;

然后我设置了一个TableNameOverride bean:

@Bean
public DynamoDBMapperConfig.TableNameOverride getTableNameOverride() {
    return DynamoDBMapperConfig.TableNameOverride.withTableNamePrefix(envPrefix);
}

最后,我使用TableNameOverride注入设置了DynamoDBMapperConfig bean。在5.0.2中,我们必须在DynamoDBMapperConfig builder中设置一个标准的DynamoDBTypeConverterFactory,以避免NPE:

@Bean
public DynamoDBMapperConfig getDynamoDBMapperConfig(DynamoDBMapperConfig.TableNameOverride tableNameOverride) {
    DynamoDBMapperConfig.Builder builder = new DynamoDBMapperConfig.Builder();
    builder.setTableNameOverride(tableNameOverride);
    builder.setTypeConverterFactory(DynamoDBTypeConverterFactory.standard());
    return builder.build();
}

事后看来,我可以设置一个DynamoDBTypeConverterFactory bean,返回一个标准的DynamoDBTypeConverterFactory,并使用DynamoDBMapperConfig生成器将其注入getDynamoDBMapperConfig()方法。但这也能起到作用。

楚鸿波
2023-03-14

可以通过更改的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

 类似资料:
  • 问题内容: 我正在尝试设置一个环境变量,然后将其读回以验证它是否确实被设置。 我有以下内容: 但是,它看起来总是空的,这意味着它可能设置不正确。 我的exec命令正确吗?javadocs声明它可以将字符串参数作为命令。 有任何想法吗? 问题答案: 这行不通。当您开始一个新过程时,该过程将收到环境 的副本 。然后,它对环境变量所做的任何更改都将在该副本中进行,并且在任何时候都不会对调用方可见。 您实

  • 问题内容: 我需要在python脚本中设置一些环境变量,并且我希望从python调用的所有其他脚本(shell脚本)(将是子进程)来查看设置的环境变量。该值为数字。 如果这样做,它会抱怨说1必须是字符串。我也想知道一旦设置它,如何在python(在脚本的后半部分)中读取环境变量。 问题答案: 你可能需要考虑其他方面的代码健壮性; 当你将整数值的变量存储为环境变量时,请尝试 然后为了进行检索,请考虑

  • 问题内容: 如何从内部设置一些环境变量以与类似命令一起使用? 这是我目前所拥有的: 我想在启动脚本中设置环境变量(例如),同时仍然能够仅通过一个命令来启动应用程序。 问题答案: 在脚本命令中设置环境变量: 然后在您的应用中使用。 注意:确保它可以跨平台工作。如果只关心Mac / Linux,则可以忽略它。

  • 问题内容: 我已经开始在Django项目中工作,我想设置一些环境变量,而不必手动设置它们或将bash文件作为源。 我想设置以下变量: 我已经读过这篇文章,但这并不能解决我想要的问题。另外,我尝试在Preferences- > Build,Execution,Deployment- > Console- > Python Console / Django Console中设置环境变量,但是它设置了解

  • 我正在Eclipse中使用Spring Boot应用程序(maven项目)。当我运行maven项目的test clean target时,我希望加载活动概要文件 我已经在application.properties和application-test.properties中添加了属性spring.profiles.active=test,aop,这没有任何影响。

  • 我必须得到一个环境变量,我不能注射。 我无法注入环境中的basUrl。 有人能告诉我怎么做吗? 我读了以下几页,我是初学者,因为我什么都不懂。https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.htmlhttps://www.mkyong.com/spring-bo