1

我正在建立一个库来访问多个数据目录。目录可以引用数据库和配置文件 (HOCON) 中定义的关联表。这是一个配置文件示例(book.conf):

author {
  database = "db_books"
  table = "author"
}

book {
  database = "db_books"
  table = "book"
}

我定义了一个代表这个配置文件的案例类(BookCatalogConfig.scala):

trait CatalogConfig

case class TableConfig(database: String, table: String)

case class BookCatalogConfig(author: TableConfig, book: TableConfig) extends CatalogConfig

然后我像这样定义我的 BookCatalog:

case class BookCatalog(environment: String) {
  /* ... */
  val config: BookCatalogConfig = CatalogConfigLoader[BookCatalogConfig](environment).load()
  /* ... */
}

还有我的 CatalogConfigLoader 实用程序:

case class CatalogConfigLoader[A <: CatalogConfig](environment: String) {
  def load(): A = {
    import pureconfig.generic.auto._
    // Note: ConfigHelper.getConfig(environment) return a Typesafe Config object with the content of book.conf)
    ConfigSource.fromConfig(ConfigHelper.getConfig(environment)).load[A] match {
      case Right(catalogConfig: A) => catalogConfig
      case Left(error: ConfigReaderFailures) => throw new Exception(error.toString())
    }
  }
}

但这不会编译并出现错误:找不到 pureconfig.ConfigReader[A] 的隐式实例。如果您尝试读取或写入案例类或密封特征,请考虑通过添加使用 PureConfig 的自动派生import pureconfig.generic.auto._

我已经阅读了很多关于该主题的内容,但没有任何解决方案有效

注意:我将 Pureconfig 0.14 用于 scala 2.11(我无法升级,因为 0.14 是 scala 2.11 的最后一个......而且我也无法升级 scala 版本......)。

4

1 回答 1

0

解决方案是(感谢 Luis Miguel 和 Matthias),并进行了一些返工:

object CatalogConfigLoader {
  def load[A <: CatalogConfig : ConfigReader : ClassTag](environment: Environment): A = {    
  ConfigSource.fromConfig(ConfigHelper.getConfig(environment.filepath)).load[A] match {
    case Right(catalogConfig: A) => catalogConfig
    case Left(error: ConfigReaderFailures) => throw new Exception(error.toString())
  }
}
于 2021-11-17T08:55:20.360 回答