Scalaのジェネリックスを使用しています私は自分のPlayアプリケーションでいくつかの一般的な関数を抽象化しようとしています。この関数は、REST JSONサービスから直列化解除されたオブジェクトを持つSeq
を返します。Scala関数の戻り値の型はgenericに基づいています
def getPeople(cityName: String): Future[Seq[People]] = {
getByEndpoint[People](s"http://localhost/person/$cityName")
}
def getPeople(): Future[Seq[Dog]] = {
getByEndpoint[Dog]("http://localhost/doge")
}
フェッチおよびデシリアライズロジックは、ジェネリックを使用して1つの関数にパックされています。
private def getByEndpoint[T](endpoint: String): Future[Seq[T]] = {
ws.url(endpoint)
.get()
.map(rsp => rsp.json)
.flatMap { json =>
json.validate[Seq[T]] match {
case s: JsSuccess[Seq[T]] =>
Future.successful(s.get)
case e: JsError =>
Future.failed(new RuntimeException(s"Get by endpoint JSON match failed: $e"))
}
}
}
問題がある、私は "No Json deserializer found for type Seq[T]. Try to implement an implicit Reads or Format for this type.
" を取得しています。私はを適切にSeq[T]
(私のC#/ Javaの記憶によれば)で正しく使用していないと確信していますが、Scalaで適切な方法を実行する方法を見つけることができません。ジェネリックを使わずにすべてが期待どおりに機能します。
'def getByEndpoint [T]'を 'def getByEndpoint [T:Format]'に変更しようとしていますか?それがうまくいくなら、私は理由を説明する答えを書いてうれしいです。 –
ありません!私が推測しているのは、モデルに設定した 'Json.format'と関係があることです。私は答えとしてマークすることができますので、返信を投稿していただけますか? – giannoug