当前位置: 首页 > 知识库问答 >
问题:

如果在控制器中的某个地方抛出异常,是否执行ContainerResponseFilter?

拓拔德馨
2023-03-14

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

这是预期的行为吗?是否有解决此问题的方法?我正在查看以下问题(Jonas的回答):
我应该如何在我的RESTful JAX-RS Web服务中记录未捕获的异常?

这使得它看起来像容器响应过滤器被执行,即使控制器中抛出异常?

我错过了什么吗?

共有2个答案

夏朗
2023-03-14

基于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);
            }
        }
    }
}

容器响应筛选器将不会执行。如果要在发生异常时设置标头,则需要一个异常处理程序来处理它。

燕意蕴
2023-03-14

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

我不想进一步调查,而只是使用一个普通的旧的javax.servlet.过滤器,但当然很难设置响应头(在链.doFilter(之后),...咕噜咕噜。

所以用了一个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);
    }
}
 类似资料:
  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • 我用Spring Boot和百里香SpringMVC。我有返回百里香模板名称的普通控制器和用< code>@RepsonseBody注释的REST控制器。 假设我有一个< code > EntityNotFoundException ,它是由控制器调用的某个代码抛出的。如果抛出,我想分别为REST控制器返回一个404状态代码和一个错误页面或错误消息。 我当前对普通控制器的设置: 对于REST控制程

  • 我有我的spring错误控制器,我需要获得实际的异常类,这样我就可以打印堆栈跟踪和其他类似的东西。这是我的错误控制器 我知道这不多,但我需要Exception对象能够做一些额外的处理。 感谢任何事先的帮助!

  • 两者的最后一个调用,即检索特定SomeDto对象的调用,可以抛出ResourceNotFoundException,该调用被配置为返回ResponseStatus NOT_Found: 但是,当调用此“未安全”时,它不会返回404 HTTP状态--它会返回401未授权: 但是,当我在RestController中显式捕获异常并将HttpServletResponse对象上的响应状态设置为 当我用一

  • 所以我正在尝试重构以下代码: 我想出了下面的开头: 但是,它不编译(显然),因为不能抛出。有什么方法可以将它添加到的方法声明中吗? 还是只有这样才能做到? 更新后,我才意识到接口非常简单,因为它只有方法。我扩展的最初原因是优先于基本功能,例如默认方法。

  • 与Spring Reactor类似:当publisher发出值时,如何引发异常? 我在DAO中有一个finder方法,它返回结果SomePojo。finder调用amazon db API和具有调用的输出。所以我在我的服务层createSomePojo方法中尝试这个hasElement()检查。(不确定我是否正确使用了它-我正在尝试和调试) 基本上:我想检查是否已经存在元素,保存是非法的,我不会调