gpt4 book ai didi

scala - Play Framework 2.0 : Store values in Http. 上下文

转载 作者:行者123 更新时间:2023-12-01 05:29:40 29 4
gpt4 key购买 nike

我正在尝试在 Play Framework 中的 scalaquery 中实现“基于请求”的 session 。我使用 scalaquery 创建了一个 session ,并尝试将其存储在当前的 http 上下文中,如下所示:

def withTransaction[A](bp: BodyParser[A])(f: Request[A] => Result): Action[A] = {
Action(bp) {
request =>
val context = Http.Context.current()
val session = createSession()
session.conn.setAutoCommit(false)
context.args.put("scalaquery.session", session)
try {
val result = f(request)
session.conn.commit()
result
}
catch {
case t: Throwable =>
session.conn.rollback()
throw t
}
finally {
session.close()
context.args.remove("scalaquery.session")
}
}
}

然后我将我的 Action 包装在我的 Controller 中,例如:
withTransaction(parse.anyContent) {
Action {
//code that produces a result here
}
}

但是,它在以下行中崩溃:
val context = Http.Context.current() 
[RuntimeException: There is no HTTP Context available from here.]

那么,为什么上下文不可用?这段代码是由框架直接调用的,所以不应该在这段代码执行的时候设置上下文吗?还是我使用错误的方式访问上下文?

编辑:“ session ”的类型为 org.scalaquery.session.Session。我想在 HttpContext 中设置它的原因是,包装的操作可以以“http 范围”的方式访问它,即每个请求单独存储它们的 session ,但所有需要 session 的服务都可以在公共(public)中找到它每个请求分开的范围。

最佳答案

我认为问题在于您将 Java API 与 Scala Controller 一起使用。 Http.Context仅当您使用 Java Controller 时才设置。您是否考虑过使用 Scala Session API ?

另外,另一个问题是,为什么需要将 session 存储在上下文中?我看到你只是在最后删除它。如果您需要子操作能够访问 session ,则可以将其传递到函数中。

我只是假设sessionSession 类型

def withTransaction[A](bp: BodyParser[A])(f: Session => Request[A] => Result): Action[A] = {
Action(bp) {
request =>
val session = createSession()
session.conn.setAutoCommit(false)
try {
val result = f(session)(request)
session.conn.commit()
result
}
catch {
case t: Throwable =>
session.conn.rollback()
throw t
}
finally {
session.close()
}
}
}

你的子 Action 是
withTransaction(parse.anyContent) { session => request =>
//code that produces a result here
}

您无需将其包装在 Action 中因为它已经被 withTransaction 包裹了

关于scala - Play Framework 2.0 : Store values in Http. 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11918562/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com