我有一个在Tomcat 7上运行的旧Web应用程序,它使用过滤器提供的非常基本的开放式会话视图机制:
@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返回到此过滤器的传播信息的可靠方法是什么。
答案 0 :(得分:1)
我不建议使用请求属性或线程局部变量,它们存在以下问题:
相反,您可以简单地从Hibernate会话对象获取当前事务并要求它回滚。 RUN!SUCCESS
。最好的,废弃代码或找到编写它的人并要求退款。