繁体   English   中英

Jersey WebApplicationException 和 servlet 过滤器

[英]Jersey WebApplicationException and servlet filters

在我的应用程序中,我为异常情况抛出 WebApplicationExceptions,以便我可以用我的 500 传回好的消息。 我遇到的问题是我有一个用于 hibernate 事务的 servlet 过滤器,并且注意到 WebApplicationException 在返回到 servlet 过滤器之前被捕获。 我已经包含了一个简短版本的 servlet 过滤器作为示例。 注意:我只有另一个 servlet 过滤器,它进行身份验证并且没有捕获

    try {
        em = MauiPersistenceUtil.getEntityManager();
        em.getTransaction().begin();

        // raises WebApplicationException
        filterChain.doFilter(request, response);

        // since WebApplicationException is trapped somewhere else up 
        // the filterChain bad data is committed here
        em.getTransaction().commit();
    } catch (Throwable ex) {
        // I want the WebApplicationException to reach here
        em.getTransaction().rollback();
    }

谢谢,赎金

编辑:瑞安斯图尔特指出我实际上并没有问过问题。 我的问题是:如何在 servlet 过滤器中判断 web 应用程序异常在 filterChain 中被抛出? 我期待 Jersey 会重新抛出异常,但这是不正确的。

既然你没有问具体的问题,我会做一些观察。

  1. 您应该使用声明性事务,例如 Spring 提供的事务,而不是尝试以这种方式自己管理它们,因为您会遇到这样的问题。
  2. 与 1. 类似,我非常怀疑您是否希望在所有异常上回滚事务。 再次,研究一个框架来帮助你。
  3. WebApplicationException 被 Jersey 拦截和处理。 大概您正在以标准方式运行 Jersey 作为 servlet。 过滤器在 servlets 附近执行。 因此,Jersey servlet 在异常进入过滤器之前对其进行处理。

您应该检查“doFilter”之后的响应状态:

 filterChain.doFilter(servletRequest, servletResponse);

 Integer status = ((HttpServletResponse) servletResponse).getStatus();
 if (HttpServletResponse.SC_INTERNAL_SERVER_ERROR.equals(status) {
     em.getTransaction().rollback();
 } else {
     em.getTransaction().commit();
 }

如果 Status 为 500 则回滚,就这么简单。 您永远不会在 Servlet 过滤器上遇到 WebApplicationException,它们会被 Jersey Servlet 捕获。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM