PropertySource可选覆盖默认值和变量名属性文件

时间:2018-09-18 01:58:30

标签: spring properties-file serenity-bdd

我在IntelliJ上有一个Serenity-BDD项目,带有Serenity-Spring和多个.properties文件,一个用于显示每个部署环境(dev,qa,生产),一个基本的.properties文件包含本地主机的变量。

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

我在CLI命令(-Denvironment)中传递了一个参数,以选择将覆盖基址的.properties文件。

./gradlew build -Denvironment

在我的@PropertiesSource中,我列出了两个文件,其中包含用于覆盖文件的环境变量:

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

但是,当我通过IntelliJ在本地运行此命令(意味着没有-Denvironment变量,意味着localhost,并且仅需要test.properties文件)时,我的输出出现以下错误:

  

INFO:无法解析属性位置[test-$ {environment} .properties]:无法解析值“ test-$ {environment} .properties”中的占位符“ environment”

此错误究竟是什么?解决该错误的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

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

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

这样,当没有环境可用时,Spring将加载 test.properties test-local.properties

通常,您有 [test-$ {environment} .properties]无法解决错误,因为占位符在加载PropertySources之前已解决(如果您认为这是逻辑,关于它)。

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

如果仅使用一个文件,则可以使用

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

这是Spring将要加载的内容

  • 等于=> local.properties
  • -Denvironment = uat =“ = uat.properties
  • -Denvironment = prod => prod.properties