Spring boot 使用@RestControllerAdvice、@ExceptionHandler處理全局請求異常

@RestControllerAdvice
public class ExceptionHandlerController {
    @ExceptionHandler
    public JsonContent handler(Exception exception) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletResponse response = attributes.getResponse();
        exception.printStackTrace();
        if (exception instanceof BizException) {
            return JsonContent.error(((BizException) exception).getCode(), exception);
        }
        if (exception instanceof PersistenceException) {
            return JsonContent.error("數據庫操作失敗,請聯繫管理員");
        }
        if(exception instanceof TokenException){
            response.setStatus(401);

            return JsonContent.error(exception.getMessage());
        }
        if (exception instanceof MethodArgumentNotValidException) {
            if (((MethodArgumentNotValidException) exception).getBindingResult().getFieldErrors().size() > 0) {
                String field = ((MethodArgumentNotValidException) exception).getBindingResult().getFieldErrors().get(0).getField();
                String defaultMessage = ((MethodArgumentNotValidException) exception).getBindingResult().getFieldErrors().get(0).getDefaultMessage();
                return JsonContent.error(500, new BizException(500, field + defaultMessage));
            }
            return JsonContent.error(500, exception);
        }
        if (exception.getCause() instanceof JsonMappingException) {
            return JsonContent.error("參數錯誤,請檢查輸入的參數");
        } else if (exception instanceof MultipartException) {
            response.setStatus(500);
            if ((((MultipartException) exception).getRootCause()) instanceof FileUploadBase.FileSizeLimitExceededException) {
                return JsonContent.error("上傳失敗:請上傳小於300M的文件");
            } else {
                return JsonContent.error("上傳失敗,請聯繫管理員");
            }
        }  else if(exception instanceof TradeException){
            return JsonContent.error(((TradeException) exception).getCode(), exception);
        }  else if(exception instanceof DuplicateKeyException){
            String pattStr = "(?<=\').*?(?=\')";
            //創建Pattern並進行匹配
            Pattern pattern= Pattern.compile(pattStr);
            Matcher m=pattern.matcher(exception.getMessage());
            String s="";
            while(m.find()){
                s=m.group();
                break;
            }
            return JsonContent.error("【"+s+"】"+"數據已被佔用");
        }

        String errorMsg = exception.getMessage();

        if (UtilsString.isBlank(errorMsg)) {
            errorMsg = "系統異常,請聯繫管理員!";
        }

        return JsonContent.error(errorMsg);
    }
}

如果在項目裏還使用了@Around,通過try_catch方式處理異常,全局異常不會生效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章