我目前无法自己测试这个语法,因此问题是:
如果值被文本包围,还会发生替换/覆盖吗?
例如,我知道:
foo.baseUrl = "http://foo:1234/"
foo.baseUrl = ${?FOO_BASE_URL}
如果 ENV var foo.baseURL
存在,将覆盖
FOO_BASE_URL
。
这里发生了什么?
foo.baseUrl = "http://foo:1234/"
foo.baseUrl = "http://${?FOO_BASE_URL}:1234/"
如果 ENV 变量存在,覆盖还会发生吗? 将它放在字符串中会否定这一点吗?
刚刚运行了一个快速测试,第二个值将替换第一个值,缺少中间部分。因此,如果
FOO_BASE_URL
未定义,并且 application.conf
包含以下内容(注意第二行中省略 "
,双引号内不执行变量替换):
foo.baseUrl = "http://foo:1234/"
foo.baseUrl = http://${?FOO_BASE_URL}:1234/
foo.baseUrl = ${?FOO_BASE_URL}
foo.baseUrl
的值将是http://:1234/
。第二行中未找到的变量被视为空字符串。文档中Substitution部分的相关引用:
如果使用
语法的替换未定义:${?foo}
- 如果它是对象字段的值,则不应创建该字段。如果该字段覆盖了同一字段之前设置的值,则之前的值将保留。
- 如果是数组元素,则不应添加该元素。
- 如果它是与另一个字符串的值连接的一部分,那么它应该成为一个空字符串;如果是与对象或数组连接的值的一部分,则它应该成为空对象或数组。
如果foo : ${?bar}
未定义,将避免创建字段foo
。如果bar
bothfoo : ${?bar}${?baz}
和未定义,bar
也会避免创建字段。baz
解决这个问题的方法是有两个变量,首先定义
foo.hostname
,然后用它来定义foo.baseUrl
:
foo.hostname = "foo"
foo.hostname = ${FOO_HOSTNAME}
foo.baseUrl = http://${?FOO_HOSTNAME}:1234/