не удалось найти неявное значение для средства чтения параметров: pureconfig.ConfigReader[T]

Можно ли вообще создать следующий метод со следующим уровнем абстракции с помощью Typesafe Config и pureconfig в scala? Я знаю, что для определенных классов Case Config Reader должен быть указан как следует из-за следующего ограничения ... но как насчет класса 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")
      }
    }
  }

person Yordan Georgiev    schedule 16.10.2017    source источник


Ответы (1)


Я предполагаю, что вы получаете ошибку времени сборки, например «Ошибка: (17, 18) не удалось найти неявное значение для чтения параметров: pureconfig.ConfigReader [T] loadConfig [T]...»

Ошибка заключается в том, что метод loadConfig в pureconfig не находит неявное значение для своего параметра чтения. Одним из решений является явное указание неявного параметра читателя. Ваш метод 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)

Я надеюсь, что это решит вашу проблему

person Timo Nikkila    schedule 26.10.2017