mak*_*aks 5 java scala typesafe-config
我想禁止解析a.b. 我想param从另一个配置替换。像这样:
val d = ConfigFactory.load(ConfigFactory.parseString(
"""
|param = x
|a.b = ${param}
""".stripMargin))
val a = ConfigFactory.parseString("param = 1")
val result = a.withFallback(d).resolve()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,param获取值 1,但a.b仍然是x
我ConfigResolveOptions.defaults().setAllowUnresolved(true)在加载 config 时尝试设置的d,但这不起作用。
我怎样才能克服这个问题?
问题是Config.load立即解决替换问题。如果你把它拿出来,它会像你想要的那样解决:
val p = ConfigFactory.parseString(
"""
|param = x
|a.b = ${param}
""".stripMargin)
val a = ConfigFactory.parseString("param = 1")
val result = a.withFallback(p).resolve()
println(result.getString("a.b"))
Run Code Online (Sandbox Code Playgroud)
这将打印 1。
你不需要使用,Config.load除非你想使用reference.conf,等等。如果你想使用,Config.load那么你应该在使用withFallback.
例如,这也会打印 1:
val p = ConfigFactory.parseString(
"""
|param = x
|a.b = ${param}
""".stripMargin)
val d = ConfigFactory.load(p)
val a = ConfigFactory.parseString("param = 1")
val result = a.withFallback(p)
val loaded = ConfigFactory.load(result)
println(loaded.getString("a.b"))
Run Code Online (Sandbox Code Playgroud)
或者说你有一个application.conf与include你想使用ConfigFactory.load()(根据您的评论)。
如果application.conf看起来像
include "foo"
Run Code Online (Sandbox Code Playgroud)
和foo.conf看起来像
a.b = ${param}
Run Code Online (Sandbox Code Playgroud)
然后这也会打印 1:
val a = ConfigFactory.parseString("param = 1")
val app = ConfigFactory.load("application", ConfigParseOptions.defaults,
ConfigResolveOptions.defaults.setAllowUnresolved(true))
val result = a.withFallback(app).resolve
println(result.getString("a.b"))
Run Code Online (Sandbox Code Playgroud)
通常,如果您希望 A 覆盖 B 以覆盖 C,那么您应该使用A.withFallback(B).withFallback(C).
找到了解决我的问题的方法:
因此,如果我有一个配置文件application.conf,它用于include包含包含替换语法的配置文件和包含将被替换的配置值声明的文件。
val a = ConfigFactory.parseString(s"""param = 1""")
val z = ConfigFactory.parseResources("application.conf") //this doesn't resolve substitutions
val result = a.withFallback(z).resolve().withFallback(ConfigFactory.load("application.conf"))
Run Code Online (Sandbox Code Playgroud)