我想重新解析配置对象。 例如,如果我定义此配置:
val conf = ConfigFactory.parseString(
"""
| foo = a
| bar = ${foo}1
| baz = ${foo}2
""".stripMargin).resolve()
我会得到这些价值观:
conf.getString("bar") //res0: String = a1
conf.getString("baz") //res1: String = a2
给定对象conf
,我想要的是能够更改foo
的值,并获取bar
和baz
的更新值。
类似的东西:
val conf2 = conf
.withValue("foo", ConfigValueFactory.fromAnyRef("b"))
.resolve()
并获得:
conf2.getString("bar") //res0: String = b1
conf2.getString("baz") //res1: String = b2
但运行此代码将导致:
conf2.getString("foo") //res0: String = b
conf2.getString("bar") //res1: String = a1
conf2.getString("baz") //res2: String = a2
这甚至可能吗?
答案 0 :(得分:4)
一旦resolve
被调用,就不可能。在the documentation for resolve
中,它说:
返回已解决所有替换的替换配置...解析已解析的配置是无害的无操作。
换句话说,一旦调用resolve
,就会发生所有子目录,并且没有对原始HOCON替换语法的引用。
当然,您可以将未解析的Config
对象保留为变量,然后使用withValue
:
val rawConf = ConfigFactory.parseString(
"""
| foo = a
| bar = ${foo}1
| baz = ${foo}2
""".stripMargin)
val conf2 = rawConf.withValue("foo", ConfigValueFactory.fromAnyRef("b")).resolve
val conf = rawConf.resolve
conf.getString("bar") //a1
conf2.getString("bar") //b1, as desired