我无法理解之间diffrence 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 */ } }
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) }
James Roper.. 7
RequestHeader
表示HTTP请求的标头. Request[A]
是一个RequestHeader
加解析的请求体A
.在播放的默认身体解析器检测到一些众所周知的体格式(application/json
,application/xml
,text/plain
,application/x-www-form-urlencoded
,multipart/form-data
),并自动解析它们变成类型的主体AnyContent
,然后让你通过调用方法,如访问特定类型asJson
.如果你写一个像这样的动作:
def myAction = Action { req => ... }
然后类型req
将是Request[AnyContent]
.另一方面,如果您明确指定了一个主体解析器,那么请求的类型将是该主体解析器返回的类型,例如:
def myAction = Action(parse.json) { req => ... }
在那种情况下,req
将是Request[JsValue]
.因此,安全社交模板需要a Request[AnyContent]
,因此首先,这意味着您只能从使用默认主体解析器的操作中使用它.接下来,这意味着您必须将您的签名更改getLoginPage
为仅接受Request[AnyContent]
,例如:
def getLoginPage(implicit request: Request[AnyContent], form: Form[(String, String)], msg: Option[String]): Html = { val req = RequestWithUser(None, request) views.html.secure.login(form, msg)(request = req) }
这应该按原样工作,只要每个调用的操作getLoginPage
都有一个由默认的主体解析器生成的请求.
RequestHeader
表示HTTP请求的标头. Request[A]
是一个RequestHeader
加解析的请求体A
.在播放的默认身体解析器检测到一些众所周知的体格式(application/json
,application/xml
,text/plain
,application/x-www-form-urlencoded
,multipart/form-data
),并自动解析它们变成类型的主体AnyContent
,然后让你通过调用方法,如访问特定类型asJson
.如果你写一个像这样的动作:
def myAction = Action { req => ... }
然后类型req
将是Request[AnyContent]
.另一方面,如果您明确指定了一个主体解析器,那么请求的类型将是该主体解析器返回的类型,例如:
def myAction = Action(parse.json) { req => ... }
在那种情况下,req
将是Request[JsValue]
.因此,安全社交模板需要a Request[AnyContent]
,因此首先,这意味着您只能从使用默认主体解析器的操作中使用它.接下来,这意味着您必须将您的签名更改getLoginPage
为仅接受Request[AnyContent]
,例如:
def getLoginPage(implicit request: Request[AnyContent], form: Form[(String, String)], msg: Option[String]): Html = { val req = RequestWithUser(None, request) views.html.secure.login(form, msg)(request = req) }
这应该按原样工作,只要每个调用的操作getLoginPage
都有一个由默认的主体解析器生成的请求.