私はこれに数時間苦労しています。問題がどこにあるかを理解するのに誰かが私を助けてくれることを願っています。
Spray-JSON のテストケースはこちら
case class Container[A](inner: Option[A])
object ReaderProtocol extends DefaultJsonProtocol {
implicit def containerReader[T :JsonFormat] =
new JsonReader[Container[T]] {
def read(value: JsValue) = value match {
case JsObject(fields) if fields.contains("content") =>
Container(Some(jsonReader[T].read(fields("content"))))
case _ => deserializationError("Unexpected format: " + value.toString)
}
}
}
}
これは、コンテナ タイプをシリアル化する方法を示しています。これを自分の状況に適応させようとしました。
case class ListResponseObject[A](url : String, data : Seq[A])
object ListResponseWriterProtocol extends DefaultJsonProtocol {
implicit def containerWriter[T: JsonFormat] = lift {
new JsonWriter[ListResponseObject[T]] {
def write(obj: ListResponseObject[T]) = JsObject(
"object" -> JsString("object"),
"url" -> JsString(obj.url),
"count" -> JsNumber(obj.data.length),
"data" -> obj.data.toJson
)
}
}
}
残念ながら、ここでこれを使用しようとすると
{ ctx : RequestContext =>
ask(cardTokenActor, ListMessage(account))
.mapTo[ListResponse]
.onComplete {
case Success(ListResponse(list: ListResponseObject[CardToken])) =>
ctx.complete(list)
case Success(_) => ctx.complete(NotFound)
case Failure(e: Throwable ) => logAndFail(ctx, e)
}
}
このエラーが発生します
161: could not find implicit value for evidence parameter of type
spray.httpx.marshalling.Marshaller[com.smoothpay.services.ListResponseObject
[com.smoothpay.services.cardtoken.entity.CardToken]]
[error] case Success(ListResponse(list: ListResponseObject[CardToken])) =>
ctx.complete(list)
また、すべての適切なインポートも用意しています。
import spray.httpx.SprayJsonSupport._
import spray.httpx.marshalling._
import spray.http._
import spray.json._
問題がどこにあるのか興味があります。事前に助けに感謝します。