到目前为止,我已经尝试过了;
1)创建一个扩展org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver并实现doResolveException(..)方法的bean(因为它已经返回了ModelAndView,所以浪费时间)。代码如下:
@Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
response.setStatus(534);
log.trace("exception from HandlerExceptionResolver");
log.error(ex.getMessage(),ex);
Client bugsnag = new Client(BUGSNAG_API_KEY);
//bugsnag code omitted
ModelAndView modelAndView=new ModelAndView("error");
return modelAndView;
}
2)创建一个实现javax.servlet.Fiter并实现doFilter(..)方法的bean(也浪费时间。因为它已经返回了ModelAndView)
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
try {
filterChain.doFilter(request, response);
} catch (Exception ex) {
errorHandler.handleError(ex);
log.trace("exception from HandlerExceptionResolver");
log.error(ex.getMessage(),ex);
Client bugsnag = new Client(BUGSNAG_API_KEY);
//bugsnag code omitted
RequestDispatcher error = request.getRequestDispatcher("error");
error.forward(request,response);
}
}
3)和@ControllerAdvice注释(除了查看异常之外的所有其他异常,如解析)
所有3个解决方案对我来说都无法捕获视图异常并导航到错误页面。我认为必须有一个过滤级别的解决方案。但我无法管理它。 (这就是返回ModelAndView对象的方法不起作用的原因)
有什么建议吗?
答案 0 :(得分:1)
@ControllerAdvice
注释不起作用,因为您只能将它用于控制器内的异常,并且您希望在视图中处理异常。我不确定AbstractHandlerExceptionResolver
,但doc指出Spring HandlerExceptionResolver
实现处理控制器执行期间发生的意外异常。但Filter方法应该可行。
为确保真正发生的事情,您应该在doFilter
方法的开头添加一个日志,在filterChain.doFilter(...);
语句之后添加另一个日志,以控制该异常是否被bean吃掉了别的东西,或者问题出在过滤器声明中。
答案 1 :(得分:0)
另一种方法是使用@RequestMapping(value="/error")
创建一个控制器方法,但我不知道您将在该方法中获得哪些信息。
此外,您可以查看How to handle exceptions thrown while rendering a view in Spring MVC?