当前位置: 首页 > 面试题库 >

播放框架2.0:将值存储在Http.Context中

子车征
2023-03-14
问题内容

我正在尝试在play框架的scalaquery中实现“基于请求”的会话。我使用scalaquery创建了一个会话,并尝试将其存储在当前的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")
       }
   }
}

然后将动作包装在控制器中,例如:

withTransaction(parse.anyContent) {
    Action {
       //code that produces a result here
    }
}

但是,它在以下行中崩溃:

val context = Http.Context.current() 
[RuntimeException: There is no HTTP Context available from here.] 

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

编辑:“会话”的类型为org.scalaquery.session.Session。我之所以要在HttpContext中进行设置,是为了使被包装的操作可以以“ http作用域”的方式访问它,即每个请求分别存储其会话,而所有需要会话的服务都可以在公共位置找到它。每个请求分隔的范围。


问题答案:

我认为问题是您在Scala控制器中使用Java API。Http.Context仅在使用Java控制器时设置。您是否考虑过使用Scala Session API?

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

我只是假设session是类型Session

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()
       }
   }
}

而您的子操作将是

withTransaction(parse.anyContent) { session => request =>
    //code that produces a result here
}

您无需再将其包装Action,因为它已经被包装withTransaction



 类似资料:
  • 问题内容: 我一直在尝试使用其构造函数创建Http.Context进行测试失败。有人看到我在做什么错吗? 我看了以下内容,但仅适用于Play 2.0: 播放框架2.0:将值存储在Http.Context中 看起来该类已针对2.2.1进行了更改,并且它为构造函数提供了更多参数,如下所示: https://github.com/playframework/playframework/blob/2.1.

  • 在用400k记录查询MongoDb时,我得到了< code>OutOfMemoryError。我收集了大约40万条用户记录。当我试图检索所有用户(在弹性搜索中转储)时,我得到了< code>OutOfMemoryError错误。 我已经浏览过这个链接,在application.config中添加了jvm.memory=-Xms64m -Xmx1024m,但还是一样的异常。 这是我的堆栈跟踪 -

  • 问题内容: 我有一个关于从自定义配置文件加载属性的问题。我尝试了两种不同的方式来加载文件,但我都无法正常工作,因此希望这里有人可以帮助我。 我尝试的第一种方法是将文件添加到conf目录中,并由此进行引用: 但这又回来了。 我尝试的第二种方法是添加: 到文件,然后在我的控制器中引用它,例如: 但是,这不能编译。 谁能说明我在这里做错了什么? 问题答案: 我不确定conf是否是类路径的一部分。因此,我

  • 我试图调用Web服务,但在播放框架2.0. x我无法调用任何编码的Web服务。 我已经研究了代码: 参考:https://stackoverflow.com/a/14938117/4410109 我已经尝试了上面的代码在Play框架2.0.8,但我得到了这个错误: 错误:找不到符号。setContentType(“application/x-www-form-urlencoded;charset=

  • 而是使用EventStream而不是ArchivedEventStream,当我运行命令alert(通知)消息时,会转到除原始发件人之外的所有连接套接字,我也可以如何发送到原始发件人。 这是我的模型和控制器,使用WebSocket 事件模型 这是控制器

  • Rest服务器(Play Framework)中的相关问题在负载测试期间出现“读取超时”异常 java版本“1.8.0_31”java(TM)SE运行时环境(Build1.8.0_31-B13)java HotSpot(TM)64位服务器VM(Build25.31-B07,混合模式) 我正在我的本地PC中测试jmeter。我使用了2000个线程,出现了超时异常,并且Socket不知为什么没有关闭。