【问题标题】:Jersey WebApplicationException and servlet filtersJersey WebApplicationException 和 servlet 过滤器
【发布时间】:2011-07-13 15:04:38
【问题描述】:

在我的应用程序中,我针对异常情况抛出 WebApplicationExceptions,这样我就可以用我的 500 回传好消息。我遇到的问题是我有一个用于休眠事务的 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();
    }

谢谢, 赎金

编辑:Ryan Stewart 指出我实际上并没有问过问题。我的问题是:如何在 servlet 过滤器中判断在 filterChain 中抛出了 Web 应用程序异常?我原以为泽西岛会重新抛出异常,但这是不正确的。

【问题讨论】:

标签: java jersey jax-rs


【解决方案1】:

由于您没有提出具体问题,所以我会做一些观察。

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

【讨论】:

  • 我想我只是希望 Jersey 重新抛出异常。这也将允许我将这些记录到另一个过滤器中。
  • Jersey User Guide 谈到了 WebApplicationException。它特别存在,以便您可以抛出异常,Jersey 会为您转换为适当的响应。如果你不想这样,那么你需要抛出除了 WebApplicationException 之外的任何东西。
  • 采纳 Ryan Stewart 的建议并抛出除 WebApplicationException 之外的任何东西。这样我就可以在 servlet 过滤器中按照我想要的方式映射事物。
【解决方案2】:

您应该检查“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 捕获。

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 2016-10-23
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2016-12-04
    相关资源
    最近更新 更多