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請求中的錯誤的統一處理。