当我使用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
)
答案 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提供了一种更简单的方法。