我希望实现一个“ExceptionController”来处理在执行其他控制器方法时抛出的异常。我没有在我的应用程序上下文中指定任何HandlerExceptionResolver,因此根据API documentation应该启动AnnotationMethodHandlerExceptionResolver。我在源头验证了这一点。那么为什么以下不起作用?
@Controller
public class ExceptionController {
@ExceptionHandler(NullPointerException.class)
public ModelAndView handleNullPointerException(NullPointerException ex) {
// Do some stuff
log.error(logging stuff)
return myModelAndView;
}
}
@Controller
public class AnotherController {
@RequestMapping(value="/nullpointerpath")
public String throwNullPointer() {
throw new NullPointerException();
}
}
我在调试日志中看到要求处理异常的三个默认异常处理程序,但没有做任何事情,我看到“DispatcherServlet - 无法完成请求”。其次是用户显示堆栈跟踪和500内部错误。
答案 0 :(得分:6)
确保您的Exception处理程序返回一个存在/映射到处理程序的视图。
答案 1 :(得分:4)
您应该将exceptionhandler写入您想要处理的同一个类,如下所示。
@Controller
public class AnotherController {
@ExceptionHandler(NullPointerException.class)
public ModelAndView handleNullPointerException(NullPointerException ex) {
// Do some stuff.
log.error(logging stuff)
return myModelAndView;
}
@RequestMapping(value="/nullpointerpath")
public String throwNullPointer() {
throw new NullPointerException();
}
}
答案 2 :(得分:1)
我认为这不是一个好设计。 Spring中的控制器处理HTTP请求并映射到URL。我不认为“异常”适合任何一个bin。感觉就像是误用了Spring。
异常不是HTTP请求。您不会将例外映射到URL。因此,我得出结论,控制器不应被视为异常处理程序。
控制器是是Spring API的一部分,但是你的设计没有按预期使用它们,所以这就是它无法正常工作的原因。重新考虑你的设计。