如何从.scala文件中获取所有配置参数?

时间:2018-11-20 09:28:45

标签: scala object config

我想在另一个Scala类中调用BeamConfig.scala中的所有参数。 BeamConfig.scala中存储的参数如下:

case class WarmStart(
  enabled: scala.Boolean,
  path: java.lang.String
)

object WarmStart {

  def apply(c: com.typesafe.config.Config): BeamConfig.Beam.WarmStart = {
    BeamConfig.Beam.WarmStart(
      enabled = c.hasPathOrNull("enabled") && c.getBoolean("enabled"),
      path = if (c.hasPathOrNull("path")) c.getString("path") else "output"
    )
  }
}

因此,类似于BeamConfig.scala中的上述对象,有100多个参数对象。如果我想从该文件中获取参数,则将执行以下操作:

beam.warmStart.enable
beam.warmStart.path

beam是根类,所以有什么方法可以让我批量调用所有参数,也可以将所有对象存储在Map或其他对象中。 谢谢

2 个答案:

答案 0 :(得分:1)

您可以通过以下几种不同的方式进行操作:

以某种有点不安全的方式使用Typesafe Config: https://github.com/lightbend/config#api-example

这将为您提供类似地图的访问权限,但是如果名称错误,类型不对齐等,它很容易爆炸。

使用PureConfig(类型安全配置周围的包装器,可以自动派生基于案例类的配置解码器,有点像json的circe) https://pureconfig.github.io/docs/

因此,您必须一次编写包含100个字段的大型caseclass,但是必须对该case类进行安全的config解码,然后再使用具有正确类型的普通命名属性。

(请注意,这会使您在重命名重构下失去不变性)

答案 1 :(得分:0)

首先,我将读取配置的代码与处理结果的代码分开。在这种情况下,默认值"output"嵌入在读取配置的代码中,而该配置可能应该在单独的遍次中完成。

第二,我将使用一个软件包从配置条目中自动填充case class。然后,每个配置对象只需要一行,就可以为您检查结果。例如

object BeamConfig {
  val warmStart = Config[WarmStart]("warmStart")
  val config2 = Config[Config2]("config2")
  ...
}

如果您需要一些处理,可以这样做

val warmStart = ProcessWarmStart(Config[WarmStart]("warmStart"))

这种方法仍然需要一些样板代码,但是与大量导入配置相比,它具有更好的类型安全性。

我还将考虑将这些对象组合成具有匹配的嵌套案例类的更少的嵌套对象。


以下是Config的简化版本,其中使用了json4sjackson

import com.typesafe.config._
import org.json4s._
import org.json4s.jackson.JsonMethods._

object Config {
  private val cfgFile = "configFile"
  private val conf = ConfigFactory.load(cfgFile).withFallback(ConfigFactory.load())
  private val jData = parse(conf.root.render(ConfigRenderOptions.concise))

  def apply[T](name: String)(implicit formats: Formats = DefaultFormats, mf: Manifest[T]): T =
    Extraction.extract(jData \\ name)(formats, mf)
}

如果特定的配置对象不存在或与类T的格式不匹配,这将引发异常。