2016-06-28 12 views
2

私はPlay Scala 2.5を使用しています。invokeBlockメソッドをオーバーライドする方法を知りたいので、jsonとしてリクエストのボディを取得することができます。オーバーライドとジェネリック型パラメータ

case class AuthenticatedRequest[A](val username: Option[String], val param: Option[String], request: Request[A]) extends WrappedRequest[A](request) 

object AuthenticatedAction extends ActionBuilder[AuthenticatedRequest] { 

    /** 
    * logger used to log actions. 
    */ 
    val logger: Logger = Logger("mylogger") 

    def invokeBlock[A](request: Request[A], block: AuthenticatedRequest[A] => Future[Result]): Future[Result] = { 
     request.session.get("username") match { 
      case Some(username) => { 
       val param = (request.body.asJson.get \ "param").as[String] 
       block(new AuthenticatedRequest(Some(username), Some(param), request)) 
      } 
      case None => Future.successful(Results.Forbidden) 
     } 
    } 
} 

は私がコンパイルした後、次の例外を持っている:

value asJson is not a member of type parameter A 
[error]     val param = (request.body.asJson.get \ "param").as[String] 
+0

リクエストにヘッダー 'Content-Type:application/json'がありますか? – Edwin

+0

はい、コンテンツタイプが含まれています:application/json – jerome

答えて

0

エラーがあなたのbodyがasJsonメソッドが定義されていないジェネリック型A、の何かを返しているという事実にリンクされています。

残念ながら、Scalaの型消去のために、パターンマッチングを直接使用することはできません(実行時に、型パラメータではなくクラスのみが存在します)。 1つのワークアラウンドは、次のように、リフレクションAPIを使用することです:あなたはタイプを取得し、その上で特定のメソッドを呼び出すことができるように許可する必要があり

import scala.reflect.runtime.universe._ 
    def invokeBlock[A](request: Request[A]) = { 
     request match { 
      case specificRequest : Request[SpecificRequest] if (typeOf[A] =:= typeOf[SpecificRequest]) => // Do the request processing 
     } 
} 

関連する問題