スプレーとスプレー json を使用して json POST 本文を解析するための汎用エクストラクターを作成しようとしています。
ただし、複数のモデルで動作させるのに苦労しています。サービス オブジェクトの case ステートメントは次のとおりです。
import MyJsonProtocol._
...
def receive = {
case Post (Routes.person.post, p: Person) => sender ! Ok(Actions.person.post(p))
case Get (Routes.foo.forId(x)) => sender ! Ok(x)
case _ => sender ! Ok("No handler")
}
そして、これが私が書いたエクストラクタです (これは、case ステートメントのスコープ内に単一のモデルの JsonReader しかない限り機能します):
//NB. Json.parse returns an Option[T]
object Post extends Request {
def unapply[T:JsonReader](req: HttpRequest): Option[(String, T)] = req match {
case HttpRequest(POST, url, _, HttpBody(_, body), _) => Json.parse[T](body.asString).map((url, _))
case _ => None
}
}
ただし、新しいモデル (および関連する JsonReader) を追加するとすぐに、コードは次のエラーでコンパイルされなくなります。
ambiguous implicit values:
[error] both value personFormat in object Json of type => spray.json.RootJsonFormat[com.rsslldnphy.foam.models.Person]
[error] and value animalFormat in object Json of type => spray.json.RootJsonFormat[com.rsslldnphy.foam.models.Animal]
[error] match expected type spray.json.JsonReader[T]
[error] case Post (Routes.person.post, p: Person) => sender ! Ok(Actions.person.post(p))
JsonReaders のジェネリック型が異なるという事実は失われているようです。このタイプの消去はありますか?私が欲しいものを手に入れる方法はありますか?
これまでのところ、プロジェクトの完全なコンパイル コードと、ExampleService
何が壊れているのかを説明するコメントがあります: github.com/rsslldnphy/foam。あなたの助けに感謝します、ありがとう。
または、私が望むことが現在不可能な場合、誰かが別のアプローチを提案できますか?