我正在使用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 :(得分:0)
错误与您的body
返回泛型类型A
的事实相关联,而未定义asJson方法。
不幸的是,你不能直接使用模式匹配来获取A的类型,因为Scala的类型擦除(在运行时,只存在类,而不是类型参数)。一种解决方法是使用反射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
}
}
这应该允许您检索类型,并能够在其上调用特定方法。