PropertySource 可选用变量命名的属性文件覆盖默认值

PropertySource optional override default with variable-named properties file

我在 IntelliJ 上有一个带有 Serenity-Spring 和多个 .properties 文件的 Serenity-BDD 项目,一个用于显示每个部署环境(开发、质量检查、生产),以及一个基本 .properties 文件,其中包含本地主机的变量。

test.properties
test-dev.properties
test-qa.properties
test-prod.properties

我在 CLI 命令 (-Denvironment) 中将一个参数传递给 select 将覆盖基础的 .properties 文件。

./gradlew build -Denvironment

在我的@PropertiesSource 中,我列出了两个文件,以及覆盖文件的环境变量:

@PropertySource(value = {"test.properties", "test-${environment}.properties"}, ignoreResourceNotFound = true)

但是,当我通过 IntelliJ 在本地 运行 执行此操作时(意思是没有 -Denvironment 变量,意思是本地主机,并且只需要 test.properties 文件),我在输出中收到以下错误:

INFO: Properties location [test-${environment}.properties] not resolvable: Could not resolve placeholder 'environment' in value "test-${environment}.properties"

这个错误到底是什么,解决它的最佳方法是什么?

当您硬编码加载两个属性文件的事实时,我会使用 Spring SpEL 默认值机制:

@PropertySource(value = {"test.properties", "test-${environment:local}.properties"})

这样,当没有可用的环境时,Spring会加载test.properties测试-local.properties.

出现 [test-${environment}.properties] not resolvable 错误是正常的,因为占位符在 PropertySources 加载之前被解析(这仔细想想是合乎逻辑的)。

此外,ignoreResourceNotFound = true容易出错,我不建议在生产代码中使用它。

如果您只使用一个文件,您可以选择

@PropertySource("${environment:local}.properties")

这是Spring加载的内容:

  • => local.properties
  • -Denvironment=uat => uat.properties
  • -Denvironment=prod => prod.properties