Spring Boot學習分享(三)——全域性異常監控實現
阿新 • • 發佈:2019-02-07
Spring Boot實現全域性異常監控並且能夠處理ajax和web兩種請求
Spring Boot提供了@ControllerAdvice以及@RestControllerAdvice兩個註解來實現全域性異常監控,再通過@ExceptionHandler註解來標明要監控的異常的型別,這裡為了實現同一類處理web和ajax請求出現的異常,使用@RestControllerAdvice
這裡定義了一個走定義的異常類DescribeException
,包含自己定義的異常,還定義了一個異常列舉類ExceptionEnum
,儲存自己定義的異常。當丟擲異常時,丟擲DescribeException
ExceptionHandle
類
ExceptionHandle .class
@RestControllerAdvice
public class ExceptionHandle {
@ExceptionHandler(value = Exception.class)
public Object exceptionGet(Exception e,HttpServletRequest request,HttpServletResponse response) {
//自定義的異常類
DescribeException MyException = null ;
//返回前端的資料格式
Result<?> result = null;
//判斷異常是否屬於已定義
if (e instanceof DescribeException) {
MyException = (DescribeException) e;
result = ResultUtil.error(MyException.getCode(), MyException.getMessage());
}
//其它再攔截器以及其它無法直接丟擲異常的地方丟擲的異常只能自己判斷,類似與shiro的許可權不足異常
else if (e instanceof UnexpectedTypeException) {
}
//上傳檔案過大異常
else if (e instanceof UnauthorizedException) {
result = ResultUtil.error(ExceptionEnum.UnauthorizedException);
}
//不屬於以上所有異常,按未定義異常處理
else {
result = ResultUtil.error(ExceptionEnum.UNKNOW_ERROR);
}
//判斷是否為ajax請求,是則返回json格式資料,不是則返回ModelAndView物件
if(isAjax(request)) {
return result;
}
else {
ModelAndView mav = new ModelAndView("error");
mav.addObject("error",result.getMsg());
return mav;
}
}
//判斷是否為ajax請求
boolean isAjax(HttpServletRequest request) {
return (request.getHeader("X-Requested-With") != null
&& "XMLHttpRequest".equals(request.getHeader("X-Requested-With").toString()));
}
}
DescribeException.class
public class DescribeException extends RuntimeException{
//錯誤狀態碼
private Integer code;
//利用定義的列舉類初始化
public DescribeException(ExceptionEnum exceptionEnum) {
super(exceptionEnum.getMsg());
this.code = exceptionEnum.getCode();
}
//自定義異常
public DescribeException(String message, Integer code) {
super(message);
this.code = code;
}
ExceptionEnum.class
public enum ExceptionEnum {
UNKNOW_ERROR(-1,"未知錯誤"),
USER_IS_EXIT(-101,"使用者已存在"),
AccountIsLocked(1,"賬戶已被鎖定,請60秒以後重試"),
UnauthorizedException(2,"無訪問許可權")
;
private Integer code;
private String msg;
ExceptionEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
(最後附上一個實用的技巧)
一般上線的時候的檔案配置和測試時候的配置是不一樣的,這時為了防止頻繁改變yml檔案內容,可以設定多個配置檔案,格式如:application-xxx.yml
而在eclipse執行時則在application.yml新增:
spring:
profiles:
active: dev
切換不同的yml檔案:
執行的時候在指令後面新增:--spring.profiles.active=xxx
即可實現