我使用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:
我正在研究拉胡尔的答案,并面临一些问题。在撰写这些问题之前,我将解释我遵循的流程。
过程:
检查图像是否有错误:
在我的用户模型类中,我没有做任何更改,因为在执行bean时,bean将替换DynamoDBTable的名称。但是,这张桌子的名字正在发生。数据仅从模型类级别给出的表名中提取。
我错过了什么?
我能够实现以活动配置文件名为前缀的表名。
首先添加了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;
对于在运行时更改表名的需要,我们也有同样的问题。我们使用的是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()方法。但这也能起到作用。
可以通过更改的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