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
我尝试在加载config
d
时设置
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
正在解决替换问题。这就是您问题的答案。