1

甚至可以在 scala 中使用 Typesafe Config 和 pureconfig 创建具有以下抽象级别的以下方法吗?由于以下限制,我知道必须按如下方式指定 Config Reader 的已定义案例类……但是任何类型的案例类呢……如果它们都实现了 ConfigReader?

    /**
      * @param path the.path.to.the.branch
      * @param config the com.typesafe.config obj
      * @tparam T - the type of the case class obj
      * @return the filled-in obj of type T
      *
      */
    def getConfigType[T](path: String, config :Config) :Option[T] = {

      val renderOpts = ConfigRenderOptions.defaults
        .setOriginComments(false).setComments(false).setJson(true)
      val levelConfig :Config = config.getConfig(path)
      val strConfig: String = config.getConfig(path).root().render(renderOpts)

      loadConfig[T](ConfigFactory.parseString(strConfig)) match {
        case Right(objFilledCaseClass) => Some(objFilledCaseClass)
        case Left(errors) => throw new RuntimeException(s"Invalid configuration: $errors")
      }
    }
  }
4

2 回答 2

4

我假设您收到构建时错误,例如“错误:(17, 18) 找不到参数读取器的隐式值:pureconfig.ConfigReader[T] loadConfig[T]...”

错误是 pureconfig 的 loadConfig 方法没有找到它的 reader 参数的隐式值。一种解决方案是显式给出隐式读取器参数。您的方法 getConfigType 可以将隐式读取器作为参数,因此 getConfigType 接口的行为类似于 loadConfig 的行为。

所以解决方案将接口定义为:

import pureconfig.{ConfigReader, loadConfig}
// Is there a reason why return type is Option? Method either returns Some or throws exception
def getConfigType[ConfigType](path: String, config :Config)(implicit reader: ConfigReader[ConfigType]):ConfigType = 
{
...
loadConfig(ConfigFactory.parseString(strConfig))(reader) match {
...
}
...
}

然后你叫它:

case class YourCustomType()
import eu.timepit.refined.pureconfig._
getConfigType[YourCustomType](path, config)

我希望这能解决你的问题

于 2017-10-26T06:45:34.543 回答
0

添加pureconfig.generic.auto.exportReader. 这提供了所需的隐式配置阅读器。

学分和参考:https ://blog.knoldus.com/4-easy-steps-to-load-configuration-with-pure-config/

于 2021-11-06T19:08:06.413 回答