找不到参数阅读器的隐含值:pureconfig.ConfigReader [T]

时间:2017-10-16 13:08:08

标签: scala typesafe-config pureconfig

甚至可以在scala中使用Typesafe Config和pureconfig创建以下具有以下抽象级别的方法吗? 我知道定义的Case Classes必须将Config Reader指定为follows,因为以下limitations ...但是Any Type of Case类...如果他们都有他们的ConfigReaders实施了?

    /**
      * @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")
      }
    }
  }

1 个答案:

答案 0 :(得分:1)

我认为你得到的构建时间错误就像 “错误:(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)

我希望这能解决你的问题