我有一个带有一些简单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!");
}
答案 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)
当您以这种方式定义方法时,我发现@ExceptionHandler
与Throwable
一起使用:
@ExceptionHandler(Throwable.class)
@ResponseBody
public String handleException(Throwable e) {
}
在这种情况下,方法只有一个Throwable
类型的参数。如果我尝试在这个方法中使用一些额外的参数(我试图使用Model),我收到500个异常(这个方法不是调用)。但是,当其他参数是HttpServlerRequest或HttpServlerResponse时,这仍然有效。
答案 3 :(得分:0)
它不起作用,因为当您返回String时,返回View名称。
现在你的Spring MVC控制器正在搜索这个方法永远不会被调用!为什么不?!查看并可以找到。
确保将@ExceptionHandler
映射到现有视图。