2011-12-10 51 views
0

我想在全局层面上处理我的异常,但似乎Spring MVC仅仅提供了一种方法来在Controller级别使用@ExceptionHandler注解(对于使用@ResponseBody注解的REST支持)处理异常,这些注解不尊重DRY原理。JAX-RS的ExceptionMapper是否支持Spring-MVC 3 REST?

我读了JAX-RS的文档,我发现ExceptionMapper为我的需要完美应对......但我需要使用Spring MVC等同3.

有没有解决方案?

谢谢。

回答

0

我终于在Spring Javadoc中搜索到响应。其实我不得不重写DefaultHandlerExceptionResolver。

然后,您必须在Web应用程序上下文中声明新的ExceptionResolver。

所以,当你在Controller中抛出一个MyNewException1时,Spring MVC可以处理它。

@Override 
protected ModelAndView doResolveException(HttpServletRequest request, 
     HttpServletResponse response, Object handler, Exception ex) { 

    try { 
     if (ex instanceof MyNewException1) { 
      return handleMyNewException1((MyNewException1) ex, request, response, 
        handler); 
     } 
     else if (ex instanceof MyNewException2) { 
      return handleMyNewException2((MyNewException2) ex, request, 
        response, handler); 
     } 
    } catch (IOException handlerException) { 
     logger.warn("Handling of [" + ex.getClass().getName() + "] resulted in Exception", handlerException); 
     return null; 
    } 

    return super.doResolveException(request, response, handler, ex); 
} 

protected ModelAndView handleMyNewException1(MyNewException1 ex, 
     HttpServletRequest request, HttpServletResponse response, 
     Object handler) throws IOException { 
      //For example send a bad request code error 
    response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage()); 
    return new ModelAndView(); 
}