使用other解析一个Typesafe Config对象

时间:2013-06-24 12:15:45

标签: scala config typesafe

我想要解析一个Config个对象,比如说config1和其他人说config2

允许排序的唯一公共API是config1.withFallback(config2).resolve()。但是,这会将config2config1的条目添加到我们想要的内容中。

在一些调查中,我们发现了一个名为ResolveContext的非公共类,它提供了一种方法。所以我们正在利用反射来利用它。我们目前的代码:

object ConfigImplicits {
  implicit class RichConfig(val config: Config) extends AnyVal {
    def resolveWith(source: Config): Config = {
      val resolver = resolveContext.getDeclaredMethod(
        "resolve", 
        abstractConfigValue, 
        abstractConfigObject, 
        configResolveOptions
      )
      resolver.setAccessible(true)
      resolver.invoke(
        null,
        config.underlyingAbstractConfigObject,
        source.underlyingAbstractConfigObject,
        ConfigResolveOptions.defaults
      ).asInstanceOf[ConfigObject].toConfig
    }

    def underlyingAbstractConfigObject = {
      val f = simpleConfig.getDeclaredField("object")
      f.setAccessible(true)
      f.get(config)
    }
  }

  val resolveContext = Class forName "com.typesafe.config.impl.ResolveContext"
  val abstractConfigValue = Class forName "com.typesafe.config.impl.AbstractConfigValue"
  val abstractConfigObject = Class forName "com.typesafe.config.impl.AbstractConfigObject"
  val configResolveOptions = classOf[ConfigResolveOptions]
  val simpleConfig = Class forName "com.typesafe.config.impl.SimpleConfig"
}

我们意识到依靠非公共内部可能不是一个好主意。所以:

  1. 是否有一种公共方法,我们不知何故错过了,已经这样做了?
  2. 如果没有,我们应该提出拉动请求吗?

1 个答案:

答案 0 :(得分:1)

AFAIK没有公共方法。一个不那么脆弱的解决方法而不是依赖于私有API可能首先解决您的源对象作为回退,然后迭代您解析的源对象中的键,并从目标对象中删除那些不需要的键。 / p>

我想不出有什么理由不添加Config.resolveWith(),但我想知道是否有原因,因为我记得考虑过它。也许我认为没有人会使用它。

如果您执行拉取请求,请务必包含测试和文档。我认为拉取请求是合理的,假设事实证明它是非常少的代码(正如我所料)。当前主分支对API添加开放,以显示在最终的1.2版本中。