Jersey WebApplicationException和servlet过滤器

时间:2011-07-13 15:04:38

标签: java jersey jax-rs

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

谢谢, 赎金

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

2 个答案:

答案 0 :(得分:4)

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

  1. 您应该使用声明式事务,例如Spring提供的事务,而不是试图以这种方式自己管理它们,完全是因为您会遇到这样的问题。
  2. 与1.类似,我非常怀疑你会想要回滚所有异常的交易。再次,看看一个框架来帮助你。
  3. 由Jersey拦截并处理WebApplicationException。大概你是以标准方式运行Jersey,作为servlet。过滤器围绕servlet执行。因此,Jersey servlet在将异常移出过滤器之前处理异常。

答案 1 :(得分:1)

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