2016-06-28 89 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 
     } 
} 

這應該允許您檢索該類型,並且能夠調用其中的特定方法。