【问题标题】:Retrieving list of objects from application.conf从 application.conf 中检索对象列表
【发布时间】:2018-12-11 19:09:12
【问题描述】:

我在 Play for Scala application.conf 中有以下条目:

    jobs = [
       {number: 0, dir: "/dir1", name: "General" },
       {number: 1, dir: "/dir2", name: "Customers" }
    ] 

我想在 Scala 程序中检索此对象列表:

    val conf = ConfigFactory.load
    val jobs = conf.getAnyRefList("jobs").asScala 
    println(jobs)

打印出来

Buffer({number=0, name=General, dir=/dir1}, {number=1, name=Customers, dir=/dir2})

但是如何将结果转换为实际的 Scala 对象呢?

【问题讨论】:

标签: scala playframework playframework-2.6


【解决方案1】:

试试这个:

case class Job(number: Int, dir: String, name: String)

object Job {
implicit val configLoader: ConfigLoader[List[Job]] = ConfigLoader(_.getConfigList).map(
    _.asScala.toList.map(config =>
      Job(
        config.getInt("number"),
        config.getString("dir"),
        config.getString("name")
      )
    )
  )
}

然后从Confugutation DI Configuration.get[List[Job]]("jobs")

【讨论】:

  • 让我失望的事情 - 你可能还需要 import scala.collection.JavaConverters.asScalaBufferConverter 才能让 .asScala 工作(如果你像我一样通过 Google 找到这个答案)
  • @JamesWhiteley 当然,但导入也取决于您使用的 scala 版本)
【解决方案2】:

这是一个Config 对象,它将从配置文件中提取数据到您指定的类型中。

用法:

case class Job(number: Int, dir: String, name: String)

val jobs = Config[List[Job]]("jobs")

代码:

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

object Config {
  private val conf = 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的格式不匹配,这将引发异常。

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 2021-07-02
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2019-02-16
    • 2011-12-17
    相关资源
    最近更新 更多