在类型安全配置中加载期间禁止解析

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仍然是xConfigResolveOptions.defaults().setAllowUnresolved(true)在加载 config 时尝试设置的d,但这不起作用。

我怎样才能克服这个问题?

sou*_*ica 5

问题是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.confinclude你想使用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).


mak*_*aks 1

找到了解决我的问题的方法:

因此,如果我有一个配置文件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)

  • 我指出的问题是“Config.load”正在解决替换问题。这就是你问题的答案。 (2认同)