使用正确的servlet过滤器将circumflex-orm集成到play 2.0 scala应用程序中

时间:2012-04-22 16:48:36

标签: scala orm playframework-2.0 circumflex-orm

我正在尝试将circumflex-orm集成到play-2.0 scala应用程序中。它可以工作,因为我可以检索并将元素保存到数据库中。 什么是行不通的缓存处理 - 事务管理。

例如,检索对象列表,更改一个,将其存储到db工作正常。 但是,如果我再次检索相同的列表,我的对象没有改变。 它的含义并没有改变,它确实在数据库中发生了变化,但缓存对此一无所知。

我确实在circurmflex小组发了一个问题,他们说他们用servletfilter做了这个(这是它的实际代码:(circumflex-orm transaction integration - 看一下主生命周期)。 这样的事就足够了:

class CircumflexContextFilter extends ServletFilter {

  import ru.circumflex.core._

  def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain) {
    Context.executeInNew { ctx =>
      chain.doFilter(req, res)
    }
  } 
}

但我不知道如何将其整合到Play 2.0应用程序中。

先谢谢, 斯文

1 个答案:

答案 0 :(得分:2)

事实证明这比我想象的要容易,irc的一个人(感谢noelw)向我指出了这些文档:scala action composition 通过阅读,答案尽可能简单:

首先,编写自己的动作类:

import play.api.mvc.Action
import play.api.mvc.Request
import play.api.mvc.Result
import ru.circumflex.core.Context

case class ScircumflexOrmActionWrapper[A](action: Action[A]) extends Action[A] {

  def apply(request: Request[A]): Result = {
    Context.executeInNew { ctx =>
      action(request)
    }
  }

  lazy val parser = action.parser
}

然后按照以下方式调用您的行为:

def index = ScircumflexOrmActionWrapper { Action { 
  val taskDbObj = Task AS "taskDb"
  val tasks = SELECT(taskDbObj.*).FROM(taskDbObj).ORDER_BY(taskDbObj.createdAt DESC).list 
  Ok(html.task.index(tasks))
}}

多数民众赞成。如果有兴趣的话,我还写了一篇关于将circumflex-orm整合到游戏中的文章:integrate circumflex-orm in play 2.0 - scala