Typesafe Config 不会发生替换

Substitutions not occurring with Typesafe Config

当我使用 Config.withValue 创建更新的配置时,不会重新评估替换,即使调用 resolve:

application.conf:

zooKeeperAddr = "localhost:2181"
zooKeeperAddr2 = ${zooKeeperAddr}

申请代码:

  val config = ConfigFactory.load()
                .withValue("zooKeeperAddr", ConfigValueFactory.fromAnyRef("abc"))
                .resolve;

  val zooKeeperAddr = config.getAnyRef("zooKeeperAddr")
  val zooKeeperAddr2 = config.getAnyRef("zooKeeperAddr2")
  println(s"zooKeeperAddr, zooKeeperAddr2 is $zooKeeperAddr, $zooKeeperAddr2")

我当然希望看到

 zooKeeperAddr, zooKeeperAddr2 is abc, abc

但我看到的却是:

 zooKeeperAddr, zooKeeperAddr2 is abc, localhost:2181

我怎样才能重新评估替补?

(更大的问题是,我正在尝试将命令行参数,特别是 Twitter 模块标志,注入到类型安全配置中。也许有更好的方法来实现这个目标?

我的实际代码是:

    val config = flag.getAll(false).foldLeft(ConfigFactory.load()){
      case (conf, f) if f.isDefined => conf.withValue(f.name, ConfigValueFactory.fromAnyRef(f.get.get))
      case (conf, _) => conf
     }.resolve

)

所以我(OP)最终做了以下事情:

  val config = flag.getAll(false).foldLeft(ConfigFactory.empty()){
      case (conf, f) if f.isDefined => conf.withValue(f.name, ConfigValueFactory.fromAnyRef(f.get.get))
      case (conf, _) => conf
    }
    .withFallback(ConfigFactory.defaultOverrides())
    .withFallback(ConfigFactory.defaultApplication())
    .withFallback(ConfigFactory.defaultReference())
    .resolve

flag.getAll returns 可迭代[com.twitter.app.Flag];对于 isDefined 的每个标志,我们将其添加到初始空配置 (ConfigFactory.empty())。

然后我们 withFallback 按顺序进行默认覆盖(设置属性)、应用程序配置(application.conf 和默认引用(应包括 我希望,所有罐子里都reference.confs。

withFallback,根据其文档,"Returns a new value computed by merging this value with another, with keys in this value "胜过另一个。

最后,我们resolve

这似乎传播了我想要的替换,但我不禁认为配置 API 提供了一种更简单的方法来做到这一点。