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 提供了一种更简单的方法来做到这一点。
当我使用 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 提供了一种更简单的方法来做到这一点。