gpt4 book ai didi

Scala:使用 PureConfig 创建通用工具

转载 作者:行者123 更新时间:2023-12-03 19:30:04 25 4
gpt4 key购买 nike

我在 scala 中寻找一些适合 akka 的实用程序,可以映射 HOCON到 Scala 类/对象。 (类似于 Spring 中的 @Configuration.yml.properties 文件映射到配置 bean/Java 类。)
我尝试过的 PureConfig :spark.conf资源中的配置文件

spark{
master {
host = 1.2.3.4
port = 7077
}
}
映射到以下 Scala 类:
trait Configuration {
val nameSpace: String
}

case class SparkConfig(master: SparkMasterConfig) extends Configuration {
override val nameSpace: String = "spark"
}

case class SparkMasterConfig(host: String,
port: Int)
PureConfig 在没有泛型的情况下工作正常:
import pureconfig.generic.auto._
import com.typesafe.config.ConfigFactory

val conf = ConfigFactory.parseResources("spark.conf")
val sparkConfig = pureconfig.loadConfig[SparkConfig]("spark")

val config = sparkConfig match {
case Left(f) => fail(f.toString)
case Right(c) => c
}
但是,以下通用 util 甚至不能与 not enough arguments for method 一起编译 error
object PureConfigLoader{
def load[T <: Configuration](clazz: Class[T]): T = {
val nameSpace = clazz.getField("nameSpace").get().asInstanceOf[String]

import pureconfig.generic.auto._
val configResult = pureconfig.loadConfig[T](nameSpace) // this doesn't compile

configResult match {
case Right(x) => x.asInstanceOf[T]
case Left(x) => throw new IllegalArgumentException(s"Fail to parse ${clazz.getSimpleName} from namespace $nameSpace")
}
}
}

val config = PureConfigLoader.load(classOf[SparkConfig])
我的问题是:
  • 我可以用这个通用的 PureConfig 工具做什么?
  • import pureconfig.generic.auto._总是被 IntelliJ 标记为未使用的导入,并且在格式化我的代码时它将被删除,如何解决这个问题?
  • 是否有任何其他配置实用程序/库以类似方式正常工作?我也试过circe-config但仍然有类似的问题。 Simple Scala Config使用 Scala 的 Dynamic 这不利于重构,如重命名配置属性字段。

  • 谢谢

    最佳答案

    我使用 Typesafe config 的小包装:

    https://github.com/kxbmap/configs

    我试过你的例子 - 这编译:

      object PureConfigLoader{
    def load[T <: MyConfig[T]](clazz: Class[T])(implicit A: Configs[T]): T = {
    val nameSpace = clazz.getField("nameSpace").get().asInstanceOf[String]

    val config = ConfigFactory.load("spark.conf")
    Configs[T].get(config, nameSpace)
    .valueOrThrow(e=>
    new IllegalArgumentException(s"Fail to parse ${clazz.getSimpleName} from namespace $nameSpace: ${e.messages}"
    )
    )
    }
    }

    val sparkConfig = PureConfigLoader.load(classOf[SparkConfig])

    abstract class MyConfig[T] (implicit A: Configs[T])

    case class SparkConfig() extends MyConfig[SparkConfig]

    更新

    我刚刚在我们的代码中看到你可能 不是 根本需要这个Util类!我们用:
    val config = ConfigFactory.load("spark.conf")
    val sparkConfig = Configs[SparkConfig].get(config, nameSpace)

    关于Scala:使用 PureConfig 创建通用工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55821890/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com