很抱歉我缺乏正确的术语,但希望这些问题至少是可以理解的:)
我正在实现一个由库调用的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
(def
或val
)。
使每一个"显式"可以帮助理解insert
(有时作为代码也更好),因为implicit parameter
首先是一个参数,所以下面的代码也是正确的。
def myAction = Action { req => insert(myRecord)(req) }