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 參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM