从不调用控制器中的Spring MVC @ExceptionHandler方法

时间:2012-03-28 14:38:38

标签: java rest spring-mvc

我有一个带有一些简单REST服务请求的Spring MVC控制器。我想在从我的服务中抛出特定异常时添加一些错误处理,但是我无法获得一个用@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!");
}

4 个答案:

答案 0 :(得分:13)

tip on the Spring forum可能会对您有所帮助。

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

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

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

应启用@HandlerException处理。

答案 1 :(得分:12)

令人沮丧的是,我也遭受了这种痛苦。我发现,如果您错误地实施Throwable而不是Exception,则异常解析程序只会将您的Throwable重新提升为IllegalStateException。这将无法调用您的@ExceptionHandler

如果您已实施Throwable而不是Exception,请尝试将其更改为Exception

以下是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 :(得分:4)

当您以这种方式定义方法时,我发现@ExceptionHandlerThrowable一起使用:

@ExceptionHandler(Throwable.class)
@ResponseBody
public String handleException(Throwable e) {

}

在这种情况下,方法只有一个Throwable类型的参数。如果我尝试在这个方法中使用一些额外的参数(我试图使用Model),我收到500个异常(这个方法不是调用)。但是,当其他参数是HttpServlerRequest或HttpServlerResponse时,这仍然有效。

答案 3 :(得分:0)

它不起作用,因为当您返回String时,返回View名称。

现在你的Spring MVC控制器正在搜索这个方法永远不会被调用!为什么不?!查看并可以找到。

确保将@ExceptionHandler映射到现有视图。