Не удалось найти неявное значение для средства чтения параметров: pureconfig.ConfigReader[T]
Можно ли вообще создать следующий метод со следующим уровнем абстракции с помощью Typesafe Config и pureconfig в scala? Для определенных классов Case я знаю, что Config Reader должен быть указан следующим образом из-за следующих ограничений... но как насчет класса Any Type 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")
}
}
}
2 ответа
Я предполагаю, что вы получаете ошибку времени сборки типа "Ошибка:(17, 18) не удалось найти неявное значение для чтения параметров: pureconfig.ConfigReader[T] loadConfig[T]... "
Ошибка в том, что метод loadConfig pureconfig не находит неявное значение для своего параметра 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)
Я надеюсь, что это решит вашу проблему
Добавить импорт
pureconfig.generic.auto.exportReader
. Это обеспечивает необходимый неявный читатель конфигурации.
Источники и ссылки: https://blog.knoldus.com/4-easy-steps-to-load-configuration-with-pure-config/