首页 > 解决方案 > 为什么 pureconfig 找不到我的隐式读者?

问题描述

我使用 double 对配置文件中的布尔值进行编码。PureConfig 在读取配置时找不到转换它的方法。


最初的问题(见下文进行编辑)。

这是一些重现该行为的代码。

import com.typesafe.config.ConfigFactory
import pureconfig.ConfigReader
import pureconfig.generic.auto._

object Main {
  def main(args: Array[String]): Unit = {
    println(pureconfig.loadConfig[BooleanTest](ConfigFactory.parseString("a = 1")))
  }
}

case class BooleanTest(a: Boolean)

object ConfigImplicits {
  implicit val myBooleanReader: ConfigReader[Boolean] = ConfigReader[Double].map { n => n > 0}
}

在这里,我希望我的代码打印一个BooleanTest. 相反,我得到了一个ConvertFailure

Left(ConfigReaderFailures(ConvertFailure(WrongType(NUMBER,Set(BOOLEAN)),None,a),List()))

解决此问题的一种方法是在调用函数import ConfigImplicits._之前添加。loadConfig但是,正如您可以想象的那样,我的代码实际上是一个更大项目的一部分,import在实际项目中添加并不能解决我的错误。

您对可能出现的问题有任何提示吗?

善良,亚历克西斯。


编辑:

Thilo 发表评论import之后,添加该语句似乎是逻辑。

以下是包含该import语句但仍产生相同错误的代码的更新版本...

将函数更改main为:

def main(args: Array[String]): Unit = {
  println(ConfigUtils.loadConfig[BooleanTest]("a = 1"))
}

并声明一个 ConfigUtils 对象,如下所示:

object ConfigUtils {
  def loadConfig[A : ConfigReader](str: String) : ConfigReader.Result[A] = {
    import ConfigImplicits._
    val config = ConfigFactory.parseString(str)
    pureconfig.loadConfig[A](config)
  }
}

运行代码,你会得到和之前一样的错误: ConvertFailure(WrongType(NUMBER,Set(BOOLEAN))

为什么不pureconfig使用我的隐式myBooleanReader来解析这个配置?

善良,亚历克西斯。

标签: scalaimplicitpureconfig

解决方案


推荐阅读