【发布时间】:2017-12-22 12:38:14
【问题描述】:
我有一个在 Tomcat 7 上运行的旧 Web 应用程序,它使用过滤器提供的非常基本的 open-session-in-view 机制:
@Override public void doFilter (ServletRequest req, ServletResponse resp, FilterChain fc)
throws IOException, ServletException
{
try {
HibernateUtil.beginTransaction();
fc.doFilter(req, resp);
HibernateUtil.commitTransaction();
} catch (Throwable t) {
Logger.exception(t, "processing servlet request");
HibernateUtil.rollbackTransaction();
throw new ServletException(t);
}
}
我现在坚持这一点,我认为我遇到了 OSIV(或至少它的这种实现)的众多缺陷之一,即我现在希望能够回滚事务,甚至 没有抛出异常。我希望 servlet 能够控制它,而且我认为我别无选择,只能以某种方式破解此功能。
我的问题是:我怎样才能将某种“回滚”标志从任意 servlet 传回这个过滤器?我希望能够在过滤器中做这样的事情:
HibernateUtil.beginTransaction();
fc.doFilter(req, resp);
if (/* something that was set by a servlet/jsp */)
HibernateUtil.rollbackTransaction();
else
HibernateUtil.commitTransaction();
我不太确定将此类信息从 servlet 传播回此过滤器的可靠方法是什么。
【问题讨论】:
-
请求属性或其他一些线程本地值。
-
@SotiriosDelimanolis 嗯,这很容易。亲爱的,谢谢。
标签: java servlets tomcat7 servlet-filters