2010-04-13 68 views
7

我希望实现一个“ExceptionController”来处理执行其他控制器方法时抛出的异常。我没有在我的应用程序上下文中指定任何HandlerExceptionResolver,所以根据API documentation AnnotationMethodHandlerExceptionResolver应该启动。我在来源中证实了这一点。那么,为什么以下工作?Spring 3控制器异常处理程序实现问题

@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内部错误。

回答

6

确保您的异常处理程序正在返回存在的视图/映射到处理程序。

+0

这似乎是问题所在。 – predhme 2010-04-14 12:36:48

+2

@predhme,那真的能解决你的问题吗?我有一个和你一样的例子,只有当异常从同一个控制器抛出时,才会调用@ExceptionHandler方法。 – curthipster 2010-04-30 05:44:56

+1

我后来也注意到了。我想最重要的是我要设置一个500页和404页,这样如果有什么我没有抓到的,用户就不会看到堆栈跟踪。 – predhme 2010-04-30 13:42:45

1

我不认为这是一个很好的设计。 Spring中的控制器处理HTTP请求并映射到URL。我不认为“例外”适合任何一个箱子。这感觉像是对我的春天的滥用。

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

控制器是Spring API的一部分,但您的设计并未按预期使用它们,所以这就是为什么它不起作用。重新考虑你的设计。

+1

它是弹簧API的一部分。不知道我明白为什么它会被误用。 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers – predhme 2010-04-13 22:32:06

4

您应该将异常处理程序写入您想要处理的同一个类,如下所示。

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