助手類 @RestControllerAdvice
RestControllerAdvice指向所有帶有註解@RestController的控制器
@ExceptionHandler(value = Exception.class)//對exception進行捕獲
通常會有web和ajax異常
思路:@RestControllerAdvice 捕獲異常 進行判斷是web異常還是ajax異常 分別作出判斷並處理
工具類 用來判斷是不是ajax請求
public class AjaxJudge {
public static boolean isAjax(HttpServletRequest request){
return request.getHeader("X-Requested-With")!=null&& "XMLHttpRequest".equals( request.getHeader("X-Requested-With").toString());
}
}
異常處理助手類
/**
* @ControllerAdvice和@RestControllerAdvice都可以指向控制器的一個子集
* RestControllerAdvice指向所有帶有註解@RestController的控制器
* ControllerAdvice指向所有指定包中的控制器
* */
@RestControllerAdvice//表明這是一個助手類 表明拋出異常的時候會被這個類捕獲
@Component
public class ExceptionHanderler {
public static final String ERRORPAGE_VIEW = "error";
@ExceptionHandler(value = Exception.class)//對exception進行捕獲
public Object errorHanderler(HttpServletRequest request, HttpServletResponse response,
Exception e) throws Exception {
//log.....................
e.printStackTrace();//這裏就將異常信息簡單打印一下 不記錄日誌了
if (AjaxJudge.isAjax(request)) {//判斷是不是ajax請求
//這裏一般會做統一json處理 狀態處理等 主要返回頁面的友好信息處理結果或狀態碼的處理結果
//404 500 501 502 503 自定義等
return e.getMessage();
} else {
//非ajax請求 做modelandview處理返回
ModelAndView model = new ModelAndView();
model.addObject("exception", e);//異常信息
model.addObject("url", request.getRequestURI());//發生錯誤異常的地址
model.setViewName(ERRORPAGE_VIEW);//前端做的錯誤頁面或自己定義的頁面返回去
return model;
}
}
}
請求
@RestController
@RequestMapping("/err")
public class HanderlerController {
@GetMapping("/error")
public String error() {
return "handerler/error";
}
@GetMapping("/ajaxError")
public String ajaxError() {
return "handerler/ajaxError";
}
}
js就不寫了 一般就是加載時啓動異步ajax向後臺發送請求
基本思路就是 判斷是ajax異步請求時異常還是web異常分別處理