Scala:使用PureConfig创建泛型util

Scala:使用PureConfig创建泛型util,scala,pureconfig,Scala,Pureconfig,我正在寻找scala中的一些实用程序,它们非常适合akka,可以映射到scala类/对象。(类似于Spring中的@Configuration将.yml或.properties文件映射到配置bean/Java类。) 我尝试的是: spark.conf参考资料中的配置文件 spark{ master { host = 1.2.3.4 port = 7077 } } 映射到以下scala类: trait Configuration { val

我正在寻找scala中的一些实用程序,它们非常适合akka,可以映射到scala类/对象。(类似于Spring中的
@Configuration
.yml
.properties
文件映射到配置bean/Java类。)

我尝试的是:

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在没有泛型的情况下运行良好:

导入pureconfig.generic.auto_
导入com.typesafe.config.ConfigFactory
val conf=ConfigFactory.parseResources(“spark.conf”)
val sparkConfig=pureconfig.loadConfig[sparkConfig](“spark”)
val config=sparkConfig匹配{
案例左侧(f)=>失败(f.toString)
案例右侧(c)=>c
}
但是,下面的泛型util甚至在编译时都没有为方法提供足够的参数

对象PureConfigLoader{
def load[T我使用一个小包装:

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

  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]
  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]
val config = ConfigFactory.load("spark.conf")
val sparkConfig = Configs[SparkConfig].get(config, nameSpace)