我有一个基于RestEasy的服务,我正在ContainerResponseFilter中进行一些清理工作。问题是如果资源抛出了未知的运行时异常(即我没有映射器的异常),则永远不会执行ContainerResponseFilter。
这是预期的行为吗?这有解决方法吗?我正在看下面的问题(乔纳斯的回答):
How should I log uncaught exceptions in my RESTful JAX-RS web service?
并且即使在控制器中抛出异常,它也会像ContainerResponseFilter一样被执行?
我错过了什么吗?
答案 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 不会执行。 如果你想在异常发生时设置头,你需要一个异常处理程序来处理它。