Scala:使用 PureConfig 创建通用实用程序
Scala: Creating generic util with PureConfig
我正在寻找 scala 中的一些实用程序,这些实用程序非常适合 akka,可以将 HOCON 映射到 Scala class/object。 (类似于 Spring 中的 @Configuration
将 .yml
或 .properties
文件映射到配置 bean/Java Class。)
我用 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
}
但是以下通用实用程序甚至无法使用 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 标记为未使用的导入,在格式化我的代码时它将被删除,如何解决这个问题?
- 是否有任何其他配置 util/library 以类似的方式正常工作?我也试过 circe-config but still got similar issues. 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 class!我们使用:
val config = ConfigFactory.load("spark.conf")
val sparkConfig = Configs[SparkConfig].get(config, nameSpace)
我正在寻找 scala 中的一些实用程序,这些实用程序非常适合 akka,可以将 HOCON 映射到 Scala class/object。 (类似于 Spring 中的 @Configuration
将 .yml
或 .properties
文件映射到配置 bean/Java Class。)
我用 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
}
但是以下通用实用程序甚至无法使用 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 标记为未使用的导入,在格式化我的代码时它将被删除,如何解决这个问题?- 是否有任何其他配置 util/library 以类似的方式正常工作?我也试过 circe-config but still got similar issues. 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 class!我们使用:
val config = ConfigFactory.load("spark.conf")
val sparkConfig = Configs[SparkConfig].get(config, nameSpace)