HOCON 条件替换周围文本

问题描述 投票:0回答:1

我目前无法自己测试这个语法,因此问题是:

如果值被文本包围,还会发生替换/覆盖吗?

例如,我知道:


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 变量存在,覆盖还会发生吗? 将它放在字符串中会否定这一点吗?

java substitution playback hocon
1个回答
4
投票

刚刚运行了一个快速测试,第二个值将替换第一个值,缺少中间部分。因此,如果

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
    。如果
    both
    foo : ${?bar}${?baz}
    bar
    未定义,
    baz
    也会避免创建字段。

解决这个问题的方法是有两个变量,首先定义

foo.hostname
,然后用它来定义
foo.baseUrl

foo.hostname = "foo"
foo.hostname = ${FOO_HOSTNAME}
foo.baseUrl = http://${?FOO_HOSTNAME}:1234/
© www.soinside.com 2019 - 2024. All rights reserved.