2016-06-28 91 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

是的,它确实包含Content-Type:application/json – jerome

回答

0

错误链接到一个事实,即你的body将返回泛型类型A,是没有定义的asJson方法的东西。因为Scala的类型擦除(在运行时,只有类存在,而不是它的类型参数),所以你不能直接使用模式匹配来获得A的类型。一种解决方法是使用反射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 
     } 
} 

这应该允许您检索该类型,并且能够调用其中的特定方法。