【发布时间】:2013-12-03 07:42:04
【问题描述】:
我无法理解 play.api.mvc.Request[A] 和 play.api.mvc.RequestHeader 和 play.api.mvc.Request[play.api.mvc.AnyContent] 之间的差异。
在编译类我有
trait Request[+A] extends scala.AnyRef with play.api.mvc.RequestHeader {
def $init$() : scala.Unit = { /* compiled code */ }
def body : A
def map[B](f : scala.Function1[A, B]) : play.api.mvc.Request[B] = { /* compiled code */ }
}
object Request extends scala.AnyRef {
def apply[A](rh : play.api.mvc.RequestHeader, a : A) : scala.AnyRef with play.api.mvc.Request[A] {
val remoteAddress : scala.Predef.String
def username : scala.None.type
val body : A
} = { /* compiled code */ }
}
Request[AnyContent] ---> RequestWithUser[play.api.mvc.AnyContent] ?
def getLoginPage[A](implicit request: Request[A], form: Form[(String, String)], msg: Option[String]): Html = {
val req = RequestWithUser(None, request)
views.html.secure.login(form, msg)(request = req)
}
此代码在 TemplatePlugin 中有效,但在视图中无效:
@(loginForm: play.api.data.Form[(String,String)], errorMsg: Option[String] = None)(implicit request: securesocial.core.RequestWithUser[_ <: play.api.mvc.AnyContent])
它不起作用,因为:
type mismatch; found : securesocial.core.RequestWithUser[A] required: securesocial.core.RequestWithUser[_ <: play.api.mvc.AnyContent]
所以我尝试将AnyContent 作为泛型类型:
def getLoginPage[A](implicit request: Request[A], form: Form[(String, String)], msg: Option[String]): Html = {
val req = RequestWithUser[play.api.mvc.AnyContent](None, request)
views.html.secure.login(form, msg)(request = req)
}
但显示下一个编译错误:
type mismatch; found : play.api.mvc.Request[A] required: play.api.mvc.Request[play.api.mvc.AnyContent]
play.api.mvc.AnyContent 看起来像:
package play.api.mvc
sealed trait AnyContent extends scala.AnyRef {
def $init$() : scala.Unit = { /* compiled code */ }
def asFormUrlEncoded : scala.Option[scala.Predef.Map[scala.Predef.String, scala.Seq[scala.Predef.String]]] = { /* compiled code */ }
def asText : scala.Option[scala.Predef.String] = { /* compiled code */ }
def asXml : scala.Option[scala.xml.NodeSeq] = { /* compiled code */ }
def asJson : scala.Option[play.api.libs.json.JsValue] = { /* compiled code */ }
def asMultipartFormData : scala.Option[play.api.mvc.MultipartFormData[play.api.libs.Files.TemporaryFile]] = { /* compiled code */ }
def asRaw : scala.Option[play.api.mvc.RawBuffer] = { /* compiled code */ }
}
请帮我解决这个问题。
已编辑 - 到目前为止的解决方案
我发现可以编译甚至运行良好的代码。尽管如此,这不是优雅的方式,因为我使用了
asInstanceOf 和演员班。
def getLoginPage[A](implicit request: Request[A], form: Form[(String, String)], msg: Option[String]): Html = {
implicit val r = RequestWithUser[play.api.mvc.AnyContent](None, request.asInstanceOf[Request[AnyContent]])
views.html.secure.login(form, msg)(request = r)
}
【问题讨论】:
标签: scala playframework playframework-2.0