【问题标题】:ExceptionHandler doesn't catch HandlerInterceptor exception if endpoint path is unknown如果端点路径未知,ExceptionHandler 不会捕获 HandlerInterceptor 异常
【发布时间】:2023-01-20 06:23:00
【问题描述】:

我有一个实现 HandlerInterceptor 接口并实现 preHandle 方法的组件。在此方法中,我从请求中检索一个参数,如果缺少该参数,则抛出 IllegalArgumentException。

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String parameter = request.getHeader("parameter123");
        if (StringUtils.isEmpty(parameter)) {
            throw new IllegalArgumentException("parameter123 not specified");
        }
        [...]
        return true;
    }

在另一个用@ControllerAdvice 注释的类中,我有一个 ExceptionHandler,它捕获 IllegalArgumentExceptions 并将它们转换为具有 HTTP 状态代码 400 的格式化响应。

通过触发我的 API 的有效路径执行此操作时,一切正常。当我尝试调用我的 API 的无效/不存在路径时出现问题。调用 HandlerInterceptor 并抛出异常,但未触发我的 ExceptionHandler,结果是基本的 HTTP 状态代码 500 异常。它似乎既覆盖了基本的 HTTP 状态 404 机制,同时也阻止了我的 ExceptionHandlers 的触发(即使是 Exception.class 上的 ExceptionHandler 也不会被调用)。

欢迎对此行为进行任何解释!谢谢

【问题讨论】:

  • 嗯,我做了一些测试,看来你是对的。我确信它像我解释的那样工作。需要进一步调查

标签: java spring spring-boot exception controller-advice


【解决方案1】:

虽然这可能是一个老问题,但我想为将来可能遇到它的任何人提供一个答案。

当您在 HandlerInterceptor 的 preHandle 方法中引发异常时,它可能被包装在另一个称为 NestedServletException 的异常中。这是 Spring 框架抛出的特定异常。

值得注意的是,NestedServletException 是在 servlet 或过滤器抛出异常时发生的运行时异常。它包含原始异常并提供有关异常发生位置的附加信息。

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2014-02-04
    • 2016-12-16
    相关资源
    最近更新 更多