SpringMVC 全局异常处理映射


SpringMVC 全局统一异常映射

统一管理项目中的异常,抛出异常,显示异常信息

  • 普通请求:在页面上显示异常信息

  • Ajax 请求:返回 JSON 数据

在springmvc中,一个请求如果是由mvc:view-controller处理的,在这过程中如果抛出了异常,那么就得用基于xml的异常映射来捕获处理这个异常。如果请求是有@RequestMapping这个注解来处理的,在这过程中发生了异常,那么就得使用基于注解的异常映射来捕获并处理这个异常。

XML 配置

    
    
        
        
            
                
                
                error
            
        
      

注解配置

判断一个请求是 Ajax 请求,还是普通请求:

查看请求头 HttpServletRequest 内容:


    /**
     * 判断当前请求是否为Ajax请求
     * @param request
     * @return true Ajax请求
     *          false 不是
     */
    public static boolean judgeRequestType(HttpServletRequest request){
        
        String headerAccept = request.getHeader("Accept");
        String headerXRequestWith = request.getHeader("X-Requested-With");

        return ((headerAccept != null && headerAccept.contains("application/json"))
             || (headerXRequestWith != null && headerXRequestWith.contains("XMLHttpRequest")));
    }
/**
 * 基于注解的异常处理类
 */
@ControllerAdvice // 表示当前类是一个基于注解的异常处理器类
public class CrowdExceptionResolver {

    /**
     *
     * @param exception 捕捉到的异常类型
     * @param request 当前请求对象
     * @param response
     * @return
     * @throws IOException
     */
    @ExceptionHandler(value = LoginFailedException.class) // 将一个具体的异常类型和一个方法关联起来
    public ModelAndView resolverLoginFailedException(LoginFailedException exception,
                                                     HttpServletRequest request,
                                                     HttpServletResponse response) throws 
        IOException {

        String viewName = "admin-login";
        return commonResolver(viewName,exception,request,response);
    }

    @ExceptionHandler(value = AccessForbiddenException.class)
    public ModelAndView resolverAccessForbiddenException(AccessForbiddenException exception,
                                                     HttpServletRequest request,
                                                     HttpServletResponse response) throws 
        IOException {

        String viewName = "admin-login";
        return commonResolver(viewName,exception,request,response);
    }


    @ExceptionHandler(value = NullPointerException.class)
    public ModelAndView resolverNullPointerException(NullPointerException exception,
                                                     HttpServletRequest request,
                                                     HttpServletResponse response) throws 
        IOException {

        String viewName = "error";
        return commonResolver(viewName,exception,request,response);
    }

    @ExceptionHandler(value = RuntimeException.class)
    public ModelAndView resolverRuntimeException(RuntimeException exception,
                                                     HttpServletRequest request,
                                                     HttpServletResponse response) throws 
        IOException {

        String viewName = "error";
        return commonResolver(viewName,exception,request,response);
    }


    @ExceptionHandler(value = ArithmeticException.class)
    public ModelAndView resolverArithmeticException(ArithmeticException exception,
                                                     HttpServletRequest request,
                                                     HttpServletResponse response) throws 
        IOException {

        String viewName = "error";
        return commonResolver(viewName,exception,request,response);
    }

    /**
     * @param viewName
     * @param exception
     * @param request
     * @param response
     * @return
     * @throws IOException
     */
    private ModelAndView commonResolver(String viewName,Exception exception,HttpServletRequest 
                                        request,
                                        HttpServletResponse response) throws IOException {
        // 1.判断请求类型
        boolean b = CrowdUtil.judgeRequestType(request);
        // 2. Ajax 请求
        if (b){
            ResultEntity failed = ResultEntity.failed(exception.getMessage());
            //2.创建GSON 对象
            Gson gson = new Gson();
            String s = gson.toJson(failed);
            //由于已经 通过原生的response对象返回响应,所以就不提供ModelAndView对象
            response.getWriter().write(s);
            return null;
        }
        // 3.不是Ajax请求
        ModelAndView mav = new ModelAndView();
        mav.addObject(CrowdConstant.ATTR_NAME_EXCEPTION,exception);
        mav.setViewName(viewName);
        return mav;
    }
}