Spring Boot 如果端点路径未知,ExceptionHandler不会捕获HandlerInterceptor异常

whlutmcx  于 2023-01-20  发布在  Spring
关注(0)|答案(1)|浏览(247)

我有一个实现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都不会被调用)。
欢迎对这种行为做出任何解释!谢谢

toiithl6

toiithl61#

虽然这可能是一个老问题,但我想为将来可能遇到它的任何人提供一个答案。
当你在一个HandlerInterceptor的preHandle方法中引发一个异常时,它可能被 Package 在另一个名为NestedServletException的异常中,这是Spring框架抛出的一个特定异常。
值得注意的是,NestedServletException是servlet或过滤器抛出异常时发生的运行时异常,它封装了原始异常,并提供了异常发生位置的附加信息。

相关问题