Spring 3控制器exception处理程序实现问题

我希望实现一个“ExceptionController”来处理在执行我的其他控制器方法时抛出的exception。 我没有在我的应用程序上下文中指定任何HandlerExceptionResolver,因此根据API文档 ,应该启动AnnotationMethodHandlerExceptionResolver。 我在源代码中validation了这一点。 那么为什么以下不起作用呢?

@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(); } } 

我在调试日志中看到要求处理exception的三个默认exception处理程序,但没有做任何事情,我看到“DispatcherServlet – 无法完成请求”。 其次是用户显示堆栈跟踪和500内部错误。

确保您的Exception处理程序返回一个存在/映射到处理程序的视图。

您应该将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(); } } 

我认为这不是一个好的设计。 Spring中的控制器处理HTTP请求并映射到URL。 我不认为“exception”适合任何一个bin。 感觉就像是对我的误用。

exception不是HTTP请求。 您不会将例外映射到URL。 因此,我得出结论,控制器不应被视为exception处理程序。

控制器 Spring API的一部分,但您的设计并未按预期使用它们,因此这就是它无法正常工作的原因。 重新考虑你的设计。