GlobalExceptionHandler.java 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package com.pavis.app.saasbacken.exception;
  2. import com.pavis.app.saasbacken.http.ErrorCode;
  3. import com.pavis.app.saasbacken.http.ResultBody;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.http.HttpStatus;
  6. import org.springframework.validation.BindingResult;
  7. import org.springframework.web.bind.MethodArgumentNotValidException;
  8. import org.springframework.web.bind.annotation.ExceptionHandler;
  9. import org.springframework.web.bind.annotation.RestControllerAdvice;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import java.util.Objects;
  13. /**
  14. * 统一异常处理器
  15. */
  16. @Slf4j
  17. @RestControllerAdvice
  18. public class GlobalExceptionHandler {
  19. /**
  20. * 其他异常
  21. */
  22. @ExceptionHandler(Exception.class)
  23. public static ResultBody exception(Exception ex, HttpServletRequest request, HttpServletResponse response) {
  24. ResultBody resultBody = resolveException(ex, request.getRequestURI());
  25. response.setStatus(resultBody.getHttpStatus());
  26. return resultBody;
  27. }
  28. /**
  29. * 静态解析异常,可以直接调用
  30. */
  31. public static ResultBody resolveException(Exception ex, String path) {
  32. ErrorCode code = ErrorCode.ERROR;
  33. int httpStatus = HttpStatus.OK.value();
  34. String className = ex.getClass().getName();
  35. if (className.contains("BadCredentialsException")) {
  36. code = ErrorCode.BAD_CREDENTIALS;
  37. } else if (className.contains("AccountExpiredException")) {
  38. code = ErrorCode.ACCOUNT_EXPIRED;
  39. } else if (className.contains("AccessDeniedException")) {
  40. code = ErrorCode.ACCESS_DENIED;
  41. } else if (className.contains("HttpMessageNotReadableException")
  42. || className.contains("TypeMismatchException")
  43. || className.contains("MissingServletRequestParameterException")) {
  44. code = ErrorCode.BAD_REQUEST;
  45. } else if (className.contains("NoHandlerFoundException")) {
  46. code = ErrorCode.NOT_FOUND;
  47. } else if (className.contains("HttpRequestMethodNotSupportedException")) {
  48. code = ErrorCode.METHOD_NOT_ALLOWED;
  49. } else if (className.contains("HttpMediaTypeNotAcceptableException")) {
  50. code = ErrorCode.MEDIA_TYPE_NOT_ACCEPTABLE;
  51. } else if (className.contains("MethodArgumentNotValidException")) {
  52. BindingResult bindingResult = ((MethodArgumentNotValidException) ex).getBindingResult();
  53. code = ErrorCode.ALERT;
  54. return ResultBody.failed().code(code.getCode()).msg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
  55. } else if (className.contains("IllegalArgumentException")) {
  56. code = ErrorCode.ILLEGAL_ARGUMENT;
  57. } else if (className.contains("AlertException")) {
  58. code = ErrorCode.ALERT;
  59. } else if (className.contains("CheckException")) {
  60. code = ErrorCode.AUTHENTICATION_FAILED;
  61. } else if (className.contains("LoginException")) {
  62. code = ErrorCode.LOGIN_FAILURE;
  63. } else if (className.contains("OrgException")) {
  64. code = ErrorCode.REQUEST_ORG_FAILED;
  65. } else if (className.contains("OpException")) {
  66. code = ErrorCode.FAIL;
  67. } else if (className.contains("NumberFormatException")) {
  68. code = ErrorCode.FAIL;
  69. }else if (className.contains("IsRelationExistException")) {
  70. code = ErrorCode.IS_RELATION_EXIST;
  71. }else if (className.contains("ExcelHeadException")) {
  72. code = ErrorCode.ERROR_EXCEL_HEAD;
  73. }
  74. return buildBody(ex, code, path, httpStatus);
  75. }
  76. /**
  77. * 构建返回结果对象
  78. */
  79. private static ResultBody buildBody(Exception exception, ErrorCode resultCode, String path, int httpStatus) {
  80. exception.printStackTrace();
  81. if (resultCode == null) {
  82. resultCode = ErrorCode.ERROR;
  83. }
  84. return ResultBody.failed().code(resultCode.getCode()).msg(exception.getMessage()).path(path).httpStatus(httpStatus);
  85. }
  86. }