2017-10-16 13 views
0

次のレベルの抽象化を、Typesafe Configおよびpureconfig in scalaで作成することは可能でしょうか? 私はConfig Readerがfollowsと指定されている定義済みのケースクラスについて認識していますが、それはlimitationsのためです...しかし、すべてのタイプのケースクラスについて...それらはすべてConfigReadersを実装していますか?は、パラメータ・リーダーの暗黙の値を見つけることができませんでした。pureconfig.ConfigReader [T]

/** 
     * @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

私はあなたが のような時エラーを構築し得ることを前提とし、 "エラー:(17、18)のパラメータリーダーのための暗黙の値を見つけることができませんでした:pureconfig.ConfigReader [T] loadConfig [T] ... "

エラーは、pureconfigのloadConfigメソッドがreaderパラメータの暗黙の値を見つけられないということです。 1つの解決策は、明示的なリーダーパラメーターを明示的に与えることです。メソッド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) 

私はこれがあなたの問題

を解決を願って
関連する問題