一般的な暗黙の変換を書くのを手伝ってもらえますか?
Scala 2.10.2 と Spray 1.2 を使用しています。
これが私が持っているものです
// for "parameters"
implicit def ObjectIdUnmarshallerString = new Deserializer[String, ObjectId] {
def apply(value: String) =
try Right(new ObjectId(value))
catch {
case ex: Throwable => Left(MalformedContent(s"Cannot parse: $value", ex))
}
}
// for "formParameters"
implicit def ObjectIdUnmarshallerHttpEntity = new Deserializer[HttpEntity, ObjectId] {
def apply(value: HttpEntity) = ObjectIdUnmarshallerString(value.asString)
}
ご覧のとおり、HttpEntity->ObjectId のデシリアライザーは単純に String->ObjectId デシリアライザーを使用します。HTTP ルーティング トレイトで使用するクラスごとに、そのようなコードをコピー アンド ペーストする必要があります。
Deserializer[String, T]
そこで、スコープ内で availableを使用するジェネリック HttpEntity->T を記述できたらどうなるか考えました。
私はこれを試しました:
implicit def GenericUnmarshallerHttpEntity[T] = new Deserializer[HttpEntity, T] {
def convertAsString(value: HttpEntity)(implicit conv: Deserializer[String, T]) = conv(value.asString)
def apply(value: HttpEntity) = convertAsString(value)
}
悲しいことに、それはうまくいきません。そして、次のように述べています。
could not find implicit value for parameter conv: spray.httpx.unmarshalling.Deserializer[String,T]
def apply(value: HttpEntity) = convertAsString(value)
^
not enough arguments for method convertAsString: (implicit conv: spray.httpx.unmarshalling.Deserializer[String,T])spray.httpx.unmarshalling.Deserialized[T].
Unspecified value parameter conv.
def apply(value: HttpEntity) = convertAsString(value)
^
それを行う方法を提案していただけますか?