玩框架2.0:在Http.Context存储值(Play framework 2.0: Store

2019-09-21 03:08发布

我试图实施“请求,基于”在剧中框架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范围的”时尚,即每个请求分别存储他们的会话,还需要一个会话中的所有服务,可以在公共找到它范围是每次请求分离。

Answer 1:

我认为这个问题是您使用的是与斯卡拉控制器的Java API。 Http.Context如果你使用的是Java控制器只设置。 你有没有考虑使用Scala的会话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



文章来源: Play framework 2.0: Store values in Http.Context