如何在play / scala中添加全局事务过滤器?

时间:2014-02-21 19:50:56

标签: scala playframework

我正在尝试设置一个全局过滤器,以便为我的整个应用添加事务性。

object TransactionFilter extends Filter {
    def apply(next: (RequestHeader) => Future[SimpleResult])(request: RequestHeader): Future[SimpleResult] = {
        next(request)
    }
}

我正在使用squeryl,它使用像这样的块:transaction {...}

object TransactionFilter extends Filter {
    def apply(next: (RequestHeader) => Future[SimpleResult])(request: RequestHeader): Future[SimpleResult] = {
        transaction { next(request) }
    }
}

当然这也不起作用,因为它只是为Future [SimpleResult]的生成添加了事务性。

我需要将Future [SimpleResult]的执行包装在事务{...}块中。

我该怎么做?我搜索过并搜索过。

另一方面,我对使用动作组合并不感兴趣,我已经做好了。

2 个答案:

答案 0 :(得分:1)

object TransactionFilter extends Filter {
  def apply(next: (RequestHeader) => Future[SimpleResult])(request: RequestHeader): Future[SimpleResult] = {
    // Begin transaction
    val tx = beginTx

    // Do the work
    val f = next(request)

    // Commit on success
    f onSuccess {
      case result => commitTx(tx)
    }

    // Rollback on failure
    f onFailure {
      case t => rollbackTx(tx)
    }

    f
  }

  def beginTx: Int = 42
  def commitTx(tx: Int) = {}
  def rollbackTx(tx: Int) = {}
}

答案 1 :(得分:0)

尝试使用slick 2.0而不是squeryl。

在slick2中,TheadLocal会话重命名为动态会话,不是默认行为。默认的是隐式会话,可以在没有问题的情况下使用