lin*_*hrr 7 typesafe-config hocon
我正在使用 HOCON 配置格式,解析库来自 typesafe.Config。HOCON 支持环境变量注入和覆盖。喜欢:
my.config = "asd"
my.config = ${?MY_ENV_VAR}
Run Code Online (Sandbox Code Playgroud)
如果存在名为 MY_ENV_VAR 的环境变量,这将替换默认值“asd”。但是我似乎找不到任何好方法来进行列表环境替换。喜欢:
my.config = [1,2,3,4]
my.config = ${?MY_ENV_LIST}
Run Code Online (Sandbox Code Playgroud)
因为默认情况下,来自外部的环境变量将默认为字符串,因此[1,2,3,4]从库的角度来看将被视为“[1,2,3,4]”,因此它不能被视为列表并且会产生运行时错误像这样:
com.typesafe.config.ConfigException$WrongType: application.conf: 5: application.boolliststring 的类型为 STRING 而不是 LIST
在 com.typesafe.config.impl.SimpleConfig.findKey(SimpleConfig.java:133) 在 com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:145) 在 com.typesafe.config.impl.SimpleConfig.find (SimpleConfig.java:151)在com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:159)在com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:164)在com.typesafe。 config.impl.SimpleConfig.getList(SimpleConfig.java:212)
任何人都知道以 HOCON 格式进行列表 env 替换的正确方法是什么?提前致谢。
til*_*lde 11
正如另一个答案所述,从一个环境变量到一个数组是不可能开箱即用的。
您可以重新解析从配置加载的字符串:
// application.conf
my.config = "list = [1, 2, 3]"
my.config = ${?LIST_VAR}
// code
String listString = ConfigFactory.load().getString("my.config")
ConfigFactory.parseString(listString).getIntList("list")
Run Code Online (Sandbox Code Playgroud)
然后设置LIST_VAR='list = [4, 5, 6]'覆盖默认值。请注意,您需要list = 因为 Hocon 的顶层需要一个对象,所以您不能使用数组。
如果你的数据足够干净,你可以在,s 上进行分割:
// application.conf
my.config = "foo,bar,baz"
my.config = ${?CSV_VAR}
// java code
String csvString = ConfigFactory.load().getString("my.config")
String[] parameters = csvString.split(",")
Run Code Online (Sandbox Code Playgroud)
然后,只需设置CSV_VAR=bing,bang,boom,pow(否[])。
另一方面,如果您为每个值使用单独的环境变量,则有多种选择。
最简单的,如果你不需要默认值,看起来像这样:
my.config = [ ${?MY_ENV_VAR}, ${?MY_ENV_VAR_TWO} ]
Run Code Online (Sandbox Code Playgroud)
任何未定义的值都将被省略。
如果您只需要添加默认值,您可以使用+= 语法:
my.config = [1, 2]
my.config += ${?MY_ENV_VAR}
my.config += ${?MY_ENV_VAR_TWO}
Run Code Online (Sandbox Code Playgroud)
任何未定义的值都不会添加到数组中。
我发现的最灵活的选项是在您的(或或选项或您提供配置的其他任何地方)中使用位置语法:application.confreference.conf-D
my.config.0 = 1 // always set to 1
my.config.1 = 2 // defaults to 2 if MY_ENV_VAR is not set
my.config.1 = ${?MY_ENV_VAR}
my.config.2 = ${?MY_ENV_VAR_TWO} // totally optional
my.config.3 = ${MY_ENV_VAR_THREE} // doesn't have ?, so it is required
Run Code Online (Sandbox Code Playgroud)
任何已定义的值都将包含在内,任何未定义的值将被跳过。例如,如果MY_ENV_VAR=4、
MY_ENV_VAR_THREE=6、 和MY_ENV_VAR_TWO未设置,则结果列表将为[1, 4, 6]。
您甚至可以在列表中定义对象,如下所示:
my.nested.0.myField = 1
my.nested.0.otherField = "hello"
my.nested.1.myField = 2
my.nested.1.myField = ${?MY_INT}
my.nested.1.otherField = "goodbye"
my.nested.1.otherField = ${?MY_STRING}
my.nested.2.myField = ${OTHER_INT} // Note lack of ?
my.nested.2.otherField = ${OTHER_STRING} // Note lack of ?
Run Code Online (Sandbox Code Playgroud)
至少在我的测试中,配置对象列表的一个问题是所有项目都需要完全定义。这就是为什么没有默认值的字段需要替换的原因。如果MY_INT=99、MY_STRING未设置、OTHER_INT=100、 和OTHER_STRING=foo,则上面的结果为:
other {
nested = [
{ myField = 1, otherField = "hello" },
{ myField = 99, otherField = "goodbye" },
{ myField = 100, otherField = "foo" }
]
}
Run Code Online (Sandbox Code Playgroud)