Java 在typesafe配置中加载期间禁止解析
我想禁止解析Java 在typesafe配置中加载期间禁止解析,java,scala,typesafe-config,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() 在这种情
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()
在这种情况下,param
获取值1,但a.b
保留x
我尝试在加载configd
时设置ConfigResolveOptions.defaults().setAllowUnresolved(true)
,但这不起作用
如何克服这个问题?我也遇到了同样的问题:当它被设计用于分层/合并配置时,试图使用“回退”来覆盖值 假设我了解您的用例,我建议改用file includes 在我的
application.conf
中,我有默认值
a.b = "placeholder"
在底部,我有以下内容:
# Local overrides - for development use
include "local.conf"
最后在local.conf
param = 1
a.b = ${param}
最终结果是
a.b
将被1
覆盖。问题是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"))
这张照片是1
您不需要使用Config.load
,除非您想使用reference.conf
等。如果您确实想使用Config.load
,那么您应该在将所有配置组合在一起后使用和fallback
例如,这还会打印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"))
或者,假设您有一个带有include
的application.conf
,希望与ConfigFactory.load()一起使用(根据您的注释)
如果application.conf
看起来像
include "foo"
a.b = ${param}
而且foo.conf
看起来像
include "foo"
a.b = ${param}
然后还打印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"))
通常,如果您希望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"))
这是一个很好的例子,但如果param=1不是静态值呢。如果它是在运行时(应用程序启动时)计算的呢?“[在代码中放入]一些逻辑,而不是在配置本身中建立值。”我的实际情况是覆盖spay的主机连接器的值。最大连接数
,并将akka的一个调度程序的执行器的最大并行数覆盖到机器上的可用处理器数。我理解。“Fallback”似乎不是那样工作的,所以这就是我必须要做的。这也是一个很好的观点,但使用load时,我只需加载我的主应用程序.conf
,它有很多导入,并且param
配置值在不同配置文件的多个位置使用(实际上它是用其中一个存根值声明的,在另一个存根值中使用)。如果我用一些可用的解析方法创建Config
对象,它们只解析application.conf中的内容并忽略所有导入也许是时候向typesafe提交一个pull请求了?你是指包含(而不是导入)吗?您的示例没有使用application.conf
。我已经更新了我的答案,以处理我认为您提出的问题。我指出的问题是Config.load
正在解决替换问题。这就是您问题的答案。