Typesafe配置不会发生替换

时间:2018-04-18 21:43:47

标签: config typesafe

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

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模块标志注入Typesafe配置。也许有更好的方法来实现这一目标?

我的实际代码是:

    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

1 个答案:

答案 0 :(得分:1)

所以我(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返回一个Iterable [com.twitter.app.Flag];对于isDefined的每个标记,我们将其添加到初始空配置(ConfigFactory.empty())。

然后我们withFallback按顺序默认覆盖(设置属性),应用程序配置(application.conf和默认引用(应该包括,我希望) ,所有jar中的所有reference.confs。)

withFallback,根据其文档,“返回通过将此值与另一个值合并计算的新值,此值中的键”胜过“另一个值。”

最后,我们resolve

这似乎按我的意愿传播了替换,但我不禁想到Config API提供了一种更简单的方法。