如何使用Spring捕获Thymeleaf(视图)渲染异常?

时间:2015-07-07 10:08:47

标签: spring thymeleaf

到目前为止,我已经尝试过了;

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对象的方法不起作用的原因)

有什么建议吗?

2 个答案:

答案 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?