package com.pavis.app.saasbacken.exception; import com.pavis.app.saasbacken.http.ErrorCode; import com.pavis.app.saasbacken.http.ResultBody; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.validation.BindingResult; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Objects; /** * 统一异常处理器 */ @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { /** * 其他异常 */ @ExceptionHandler(Exception.class) public static ResultBody exception(Exception ex, HttpServletRequest request, HttpServletResponse response) { ResultBody resultBody = resolveException(ex, request.getRequestURI()); response.setStatus(resultBody.getHttpStatus()); return resultBody; } /** * 静态解析异常,可以直接调用 */ public static ResultBody resolveException(Exception ex, String path) { ErrorCode code = ErrorCode.ERROR; int httpStatus = HttpStatus.OK.value(); String className = ex.getClass().getName(); if (className.contains("BadCredentialsException")) { code = ErrorCode.BAD_CREDENTIALS; } else if (className.contains("AccountExpiredException")) { code = ErrorCode.ACCOUNT_EXPIRED; } else if (className.contains("AccessDeniedException")) { code = ErrorCode.ACCESS_DENIED; } else if (className.contains("HttpMessageNotReadableException") || className.contains("TypeMismatchException") || className.contains("MissingServletRequestParameterException")) { code = ErrorCode.BAD_REQUEST; } else if (className.contains("NoHandlerFoundException")) { code = ErrorCode.NOT_FOUND; } else if (className.contains("HttpRequestMethodNotSupportedException")) { code = ErrorCode.METHOD_NOT_ALLOWED; } else if (className.contains("HttpMediaTypeNotAcceptableException")) { code = ErrorCode.MEDIA_TYPE_NOT_ACCEPTABLE; } else if (className.contains("MethodArgumentNotValidException")) { BindingResult bindingResult = ((MethodArgumentNotValidException) ex).getBindingResult(); code = ErrorCode.ALERT; return ResultBody.failed().code(code.getCode()).msg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } else if (className.contains("IllegalArgumentException")) { code = ErrorCode.ILLEGAL_ARGUMENT; } else if (className.contains("AlertException")) { code = ErrorCode.ALERT; } else if (className.contains("CheckException")) { code = ErrorCode.AUTHENTICATION_FAILED; } else if (className.contains("LoginException")) { code = ErrorCode.LOGIN_FAILURE; } else if (className.contains("OrgException")) { code = ErrorCode.REQUEST_ORG_FAILED; } else if (className.contains("OpException")) { code = ErrorCode.FAIL; } else if (className.contains("NumberFormatException")) { code = ErrorCode.FAIL; }else if (className.contains("IsRelationExistException")) { code = ErrorCode.IS_RELATION_EXIST; }else if (className.contains("ExcelHeadException")) { code = ErrorCode.ERROR_EXCEL_HEAD; } return buildBody(ex, code, path, httpStatus); } /** * 构建返回结果对象 */ private static ResultBody buildBody(Exception exception, ErrorCode resultCode, String path, int httpStatus) { exception.printStackTrace(); if (resultCode == null) { resultCode = ErrorCode.ERROR; } return ResultBody.failed().code(resultCode.getCode()).msg(exception.getMessage()).path(path).httpStatus(httpStatus); } }