zoukankan      html  css  js  c++  java
  • Spring Boot配置全局异常捕获

    1 SpringBoot配置全局的异常捕获

    项目的说明

    • 配置thymeleaf作为视图模板
    • ExceptionController.java模拟测试用
    • MyAjaxExceptionHandler.java捕获到异常以ajax形式返回
    • MyExceptionHandler.java捕获到异常以页面形式返回
    • ajaxerror.html这个是测试返回ajax异常的页面
    • error.html以页面形式返回的异常到这个页面

    1.1 页面跳转形式

    1.1.1 配置

    MyExceptionHandler.java

    @ControllerAdvice
    public class MyExceptionHandler {
        public static final String ERROR_VIEW = "error";
        @ExceptionHandler(value = Exception.class)
        public Object errorHandler(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {
            e.printStackTrace();
            ModelAndView mav = new ModelAndView();
            mav.addObject("exception", e);
            mav.addObject("url", request.getRequestURL());
            mav.setViewName(ERROR_VIEW);
            return mav;
        }
    }
    

    1.1.2 验证

    1.2 ajax形式

    1.2.1 配置

    MyAjaxExceptionHandler.java

    @RestControllerAdvice
    public class MyAjaxExceptionHandler {
        @ExceptionHandler(value = Exception.class)
        public JsonResult defaultErrorHandler(HttpServletRequest request, Exception e) throws Exception {
            e.printStackTrace();
            return JsonResult.errorException(e.getMessage());
        }
    }
    

    1.2.2 验证

    注意在验证这一步时,把MyExceptionHandler.java这个类给注释了,因为如果不注释的话,两个类都会拦截Exception了。

    1.3 统一返回异常的形式

    下面在MyExceptionHandler.java的基础上配置

    1.3.1 配置

    MyExceptionHandler.java

    @RestControllerAdvice
    public class MyExceptionHandler {
        public static final String ERROR_VIEW = "error";
        @ExceptionHandler(value = Exception.class)
        public Object errorHandler(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {
            e.printStackTrace();
            if (isAjax(request)) {
                return JsonResult.errorException(e.getMessage());
            } else {
                ModelAndView mav = new ModelAndView();
                mav.addObject("exception", e);
                mav.addObject("url", request.getRequestURL());
                mav.setViewName(ERROR_VIEW);
                return mav;
            }
        }
    
        // 判断是否是ajax请求
        public static boolean isAjax(HttpServletRequest httpRequest) {
            String xRequestedWith = httpRequest.getHeader("X-Requested-With");
            return (xRequestedWith != null && "XMLHttpRequest".equals(xRequestedWith));
        }
    }
    

    1.3.2 验证

    参照上两步的验证,验证前先把MyAjaxExceptionHandler.java给注了。

    2 小结

    # 注意区分
    # 在类上的注解
    @ControllerAdvice
    @RestControllerAdvice
    # 在方法上的注解
    @ExceptionHandler(value = Exception.class)
    
    # 在统一返回异常的形式配置中
    类上的注解为@RestControllerAdvice
    方法中返回ModelAndView对象就是返回页面,返回一个其他对象就会转换为json串,这样就实现了对页面请求和ajax请求中的错误的统一处理。
    

    3 参考

  • 相关阅读:
    Go语言string,int,int64 ,float转换
    Go 时间相关
    静态顺序表操作
    汇编基础
    C语言字节对齐
    BugkuCTF-游戏过关
    数组越界问题分析
    选择排序(Java)
    杨辉三角(C语言)
    二分查找(Java)
  • 原文地址:https://www.cnblogs.com/okokabcd/p/9175797.html
Copyright © 2011-2022 走看看