重新解析scala配置对象

时间:2015-04-28 12:21:15

标签: scala typesafe-config

我想重新解析配置对象。 例如,如果我定义此配置:

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的值,并获取barbaz的更新值。 类似的东西:

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

这甚至可能吗?

1 个答案:

答案 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