【问题标题】:Is ContainerResponseFilter executed if an exception is thrown somewhere in a controller?如果在控制器的某处抛出异常,是否会执行 ContainerResponseFilter?
【发布时间】:2016-01-05 09:01:16
【问题描述】:

我有一个基于 RestEasy 的服务,我在 ContainerResponseFilter 中进行一些清理工作。问题是,如果资源抛出未知的运行时异常(即我没有映射器的异常),则永远不会执行 ContainerResponseFilter。

这是预期的行为吗?有解决方法吗?我正在查看以下问题(乔纳斯的回答):
How should I log uncaught exceptions in my RESTful JAX-RS web service?

这使得即使在控制器中引发异常时也似乎执行了 ContainerResponseFilter?

我错过了什么吗?

【问题讨论】:

    标签: jax-rs resteasy


    【解决方案1】:

    对我也不起作用。这声称它应该工作:https://github.com/Graylog2/graylog2-server/issues/1826

    我不想进一步调查,只是使用一个普通的旧 javax.servlet.Filter,但当然很难设置响应头(在 chain.doFilter() 之后,... grr..

    所以使用了 Spring 解决方案:

    public static class MyFilter extends OncePerRequestFilter {
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            response.setHeader("MyHeader", "MyValue");
            filterChain.doFilter(request, response);
        }
    }
    

    【讨论】:

      【解决方案2】:

      基于RestEasy中SynchronousDispatcher的源码。

          protected void writeResponse(HttpRequest request, HttpResponse response, Response jaxrsResponse) {
          try {
              ServerResponseWriter.writeNomapResponse((BuiltResponse)jaxrsResponse, request, response, this.providerFactory);
          } catch (Exception var5) {
              this.writeException(request, response, var5);
          }
      
      }
      
      
          public void writeException(HttpRequest request, HttpResponse response, Throwable e) {
          if (response.isCommitted()) {
              throw new UnhandledException("Response is committed, can't handle exception", e);
          } else {
              Response handledResponse = (new ExceptionHandler(this.providerFactory, this.unwrappedExceptions)).handleException(request, e);
              if (handledResponse == null) {
                  throw new UnhandledException(e);
              } else {
                  try {
                      ServerResponseWriter.writeNomapResponse((BuiltResponse)handledResponse, request, response, this.providerFactory);
                  } catch (Exception var6) {
                      throw new UnhandledException(var6);
                  }
              }
          }
      }
      

      ContainerResponseFilter 不会执行。 如果你想在异常发生时设置 headers,你需要一个异常处理程序来处理它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        • 2019-05-15
        • 1970-01-01
        • 1970-01-01
        • 2011-10-18
        相关资源
        最近更新 更多