Scala Play 2.3让请求返回作用域



很抱歉我缺乏正确的术语,但希望这些问题至少是可以理解的:)

我正在实现一个由库调用的trait -所以我不能访问代码的"中间"。

Controller -> Action (get request in scope) -> Library -> Trait -> my code to save to database

def insert(newRecord: Token)(implicit request: play.api.mvc.Request[Any]) = database.withSession { implicit db:Session => {

一个编译错误:在这里找不到任何HTTP请求

是否有办法让请求回到作用域中?

代码:具体来说,我使用的是play2-oauth2-provider,我所理解的相关代码片段是

Get request in scope in Action, this is working right

def accessToken = Action.async {
    implicit request =>
      val header = request.remoteAddress
      issueAccessToken(new UserOauth())

请求然后通过库传递(几次)-库代码中请求仍然在作用域中的最后一点是调用-

handler.handleRequest(request, dataHandler)
  override def handleRequest[U](request: AuthorizationRequest, dataHandler: DataHandler[U]): GrantHandlerResult = {
    .....
    issueAccessToken(dataHandler, authInfo)
  }

handlerrequest调用issueAccessToken的最后一行。

根据我的理解,这是对请求的引用丢失的地方,我的问题是-"是否有任何方法可以将其找回来。"同样,我不能改变这段代码,因为它在一个库中。

  def issueAccessToken[U](dataHandler: DataHandler[U], authInfo: AuthInfo[U]): GrantHandlerResult = {
    ...
 dataHandler.createAccessToken(authInfo)
    }

我的代码是

class UserOauth extends DataHandler[Credentials] {
  def createAccessToken....

最终调用我的数据模型-我想从请求对象

获得一些东西

谢谢,布伦特

insert函数需要来自上下文/调用者的请求(这就是implicit request在那里的意思)。没有找到隐式提供的请求,编译器抛出错误。

要修复它,你必须在调用insert的代码中声明一个隐式的当前请求(由Play Action提供)。implicit必须在调用方和被调用方之间并排对应,例如

def myAction = Action { implicit req => // instead of just Action { req => ... }
  insert(myRec)
}
def myAsyncAction = Action async { implicit req =>
  Future { insert(myRec)
}

任何implicit parameter都在当前implicit scope(来自调用者)中寻找匹配的implicit value (defval)。

使每一个"显式"可以帮助理解insert(有时作为代码也更好),因为implicit parameter首先是一个参数,所以下面的代码也是正确的。

def myAction = Action { req => insert(myRecord)(req) }

最新更新