控制器中的弹簧MVC@ExceptionHandler方法从未被调用

2022-09-03 18:03:50

我有一个Spring MVC控制器,其中包含一些简单的REST服务请求。当从我的服务中抛出特定异常时,我想添加一些错误处理,但是我无法获得带有实际调用@ExceptionHandler注释的处理程序方法。下面是一个服务,我故意抛出一个异常,试图让我的处理程序方法接管。处理程序方法永远不会被调用,Spring只向调用客户端返回500错误。你对我做错了什么有什么想法吗?

@ExceptionHandler(IOException.class)
public ModelAndView handleIOException(IOException ex, HttpServletRequest request, HttpServletResponse response) {
    response.sendError(HttpServletResponse.SC_FORBIDDEN);
    System.out.println("It worked!");
    return new ModelAndView();
}

@RequestMapping(value = "/json/remove-service/{id}", method = RequestMethod.DELETE)
public void remove(@PathVariable("id") Long id) throws IOException {
    throw new IOException("The handler should take over from here!");
}

答案 1

令人沮丧的是,我也遭受了这种痛苦。我发现,如果您错误地实现了异常解析器而不是异常解析器,则只会将您作为.这将无法调用您的 .ThrowableExceptionThrowableIllegalStateException@ExceptionHandler

如果您已经实现而不是尝试将其更改为。ThrowableExceptionException

这是有问题的代码InvocableHandlerMethod

catch (InvocationTargetException e) {
            // Unwrap for HandlerExceptionResolvers ...
            Throwable targetException = e.getTargetException();
            if (targetException instanceof RuntimeException) {
                throw (RuntimeException) targetException;
            }
            else if (targetException instanceof Error) {
                throw (Error) targetException;
            }
            else if (targetException instanceof Exception) {
                throw (Exception) targetException;
            }
            else {
                String msg = getInvocationErrorMessage("Failed to invoke controller method", args);
                throw new IllegalStateException(msg, targetException);
            }
        }

答案 2

春季论坛上的这个提示可能会对您有所帮助。

您可能已经在 webmvc-servlet.xml 文件中为您的配置了 bean(*-servlet.xml文件可能以不同的方式命名)DispatchServlet

如果XML文件已经包含另一个(如Spring不会自动为您添加任何其他解析器)。因此,手动添加注释解析器,如下所示:ExceptionResolverSimpleMappingExceptionResovler

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" />

应启用处理。@HandlerException