如果在控制器中某处抛出异常,ContainerResponseFilter是否被执行?

时间:2015-10-07 23:08:50

标签: jax-rs resteasy

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

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

并且即使在控制器中抛出异常,它也会像ContainerResponseFilter一样被执行?

我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

也不适合我。这声称它应该工作: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);
    }
}

答案 1 :(得分:0)

基于 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 不会执行。 如果你想在异常发生时设置头,你需要一个异常处理程序来处理它。