package com.kidgrow.common.exception;
import com.kidgrow.common.model.ErrorCode;
import com.kidgrow.common.model.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.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
*
* @Description:
* @Project:
* @CreateDate: Created in 2020/2/4 14:13
* @Author: liuke
*/
@ControllerAdvice
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
/**
* 统一异常处理
* AuthenticationException
*
* @param ex
* @param request
* @param response
* @return
*/
// @ExceptionHandler({AuthenticationException.class})
// public static ResultBody authenticationException(Exception ex, HttpServletRequest request, HttpServletResponse response) {
// ResultBody resultBody = resolveException(ex, request.getRequestURI());
// response.setStatus(resultBody.getHttpStatus());
// return resultBody;
// }
/**
* OAuth2Exception
*
* @param ex
* @param request
* @param response
* @return
*/
// @ExceptionHandler({OAuth2Exception.class, InvalidTokenException.class})
// public static ResultBody oauth2Exception(Exception ex, HttpServletRequest request, HttpServletResponse response) {
// ResultBody resultBody = resolveException(ex, request.getRequestURI());
// response.setStatus(resultBody.getHttpStatus());
// return resultBody;
// }
/**
* 自定义异常
*
* @param ex
* @param request
* @param response
* @return
*/
@ExceptionHandler({KidgrowException.class})
public static ResultBody openException(Exception ex, HttpServletRequest request, HttpServletResponse response) {
ResultBody resultBody = resolveException(ex, request.getRequestURI());
response.setStatus(resultBody.getHttpStatus());
return resultBody;
}
/**
* 其他异常
*
* @param ex
* @param request
* @param response
* @return
*/
@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;
}
/**
* 静态解析异常。可以直接调用
*
* @param ex
* @return
*/
public static ResultBody resolveException(Exception ex, String path) {
ErrorCode code = ErrorCode.ERROR;
int httpStatus = HttpStatus.INTERNAL_SERVER_ERROR.value();
String message = ex.getMessage();
String superClassName = ex.getClass().getSuperclass().getName();
String className = ex.getClass().getName();
if (className.contains("UsernameNotFoundException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.USERNAME_NOT_FOUND;
} else if (className.contains("BadCredentialsException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.BAD_CREDENTIALS;
} else if (className.contains("AccountExpiredException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.ACCOUNT_EXPIRED;
} else if (className.contains("LockedException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.ACCOUNT_LOCKED;
} else if (className.contains("DisabledException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.ACCOUNT_DISABLED;
} else if (className.contains("CredentialsExpiredException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.CREDENTIALS_EXPIRED;
} else if (className.contains("InvalidClientException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.INVALID_CLIENT;
} else if (className.contains("UnauthorizedClientException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.UNAUTHORIZED_CLIENT;
}else if (className.contains("InsufficientAuthenticationException") || className.contains("AuthenticationCredentialsNotFoundException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.UNAUTHORIZED;
} else if (className.contains("InvalidGrantException")) {
code = ErrorCode.ALERT;
if ("Bad credentials".contains(message)) {
code = ErrorCode.BAD_CREDENTIALS;
} else if ("User is disabled".contains(message)) {
code = ErrorCode.ACCOUNT_DISABLED;
} else if ("User account is locked".contains(message)) {
code = ErrorCode.ACCOUNT_LOCKED;
}
} else if (className.contains("InvalidScopeException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.INVALID_SCOPE;
} else if (className.contains("InvalidTokenException")) {
httpStatus = HttpStatus.UNAUTHORIZED.value();
code = ErrorCode.INVALID_TOKEN;
} else if (className.contains("InvalidRequestException")) {
httpStatus = HttpStatus.BAD_REQUEST.value();
code = ErrorCode.INVALID_REQUEST;
} else if (className.contains("RedirectMismatchException")) {
code = ErrorCode.REDIRECT_URI_MISMATCH;
} else if (className.contains("UnsupportedGrantTypeException")) {
code = ErrorCode.UNSUPPORTED_GRANT_TYPE;
} else if (className.contains("UnsupportedResponseTypeException")) {
code = ErrorCode.UNSUPPORTED_RESPONSE_TYPE;
} else if (className.contains("UserDeniedAuthorizationException")) {
code = ErrorCode.ACCESS_DENIED;
} else if (className.contains("AccessDeniedException")) {
code = ErrorCode.ACCESS_DENIED;
httpStatus = HttpStatus.FORBIDDEN.value();
if (ErrorCode.ACCESS_DENIED_BLACK_LIMITED.getMessage().contains(message)) {
code = ErrorCode.ACCESS_DENIED_BLACK_LIMITED;
} else if (ErrorCode.ACCESS_DENIED_WHITE_LIMITED.getMessage().contains(message)) {
code = ErrorCode.ACCESS_DENIED_WHITE_LIMITED;
} else if (ErrorCode.ACCESS_DENIED_AUTHORITY_EXPIRED.getMessage().contains(message)) {
code = ErrorCode.ACCESS_DENIED_AUTHORITY_EXPIRED;
}else if (ErrorCode.ACCESS_DENIED_UPDATING.getMessage().contains(message)) {
code = ErrorCode.ACCESS_DENIED_UPDATING;
}else if (ErrorCode.ACCESS_DENIED_DISABLED.getMessage().contains(message)) {
code = ErrorCode.ACCESS_DENIED_DISABLED;
} else if (ErrorCode.ACCESS_DENIED_NOT_OPEN.getMessage().contains(message)) {
code = ErrorCode.ACCESS_DENIED_NOT_OPEN;
}
} else if (className.contains("HttpMessageNotReadableException")
|| className.contains("TypeMismatchException")
|| className.contains("MissingServletRequestParameterException")) {
httpStatus = HttpStatus.BAD_REQUEST.value();
code = ErrorCode.BAD_REQUEST;
} else if (className.contains("NoHandlerFoundException")) {
httpStatus = HttpStatus.NOT_FOUND.value();
code = ErrorCode.NOT_FOUND;
} else if (className.contains("HttpRequestMethodNotSupportedException")) {
httpStatus = HttpStatus.METHOD_NOT_ALLOWED.value();
code = ErrorCode.METHOD_NOT_ALLOWED;
} else if (className.contains("HttpMediaTypeNotAcceptableException")) {
httpStatus = HttpStatus.BAD_REQUEST.value();
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(bindingResult.getFieldError().getDefaultMessage());
} else if (className.contains("IllegalArgumentException")) {
//参数错误
code = ErrorCode.ALERT;
httpStatus = HttpStatus.BAD_REQUEST.value();
} else if (className.contains("OpenAlertException")) {
code = ErrorCode.ALERT;
} else if (className.contains("OpenSignatureException")) {
httpStatus = HttpStatus.BAD_REQUEST.value();
code = ErrorCode.SIGNATURE_DENIED;
}else if(message.equalsIgnoreCase(ErrorCode.TOO_MANY_REQUESTS.name())){
code = ErrorCode.TOO_MANY_REQUESTS;
}
return buildBody(ex, code, path, httpStatus);
}
/**
* 构建返回结果对象
*
* @param exception
* @return
*/
private static ResultBody buildBody(Exception exception, ErrorCode resultCode, String path, int httpStatus) {
if (resultCode == null) {
resultCode = ErrorCode.ERROR;
}
ResultBody resultBody = ResultBody.failed().code(resultCode.getCode()).msg(exception.getMessage()).path(path).httpStatus(httpStatus);
log.error("==> error:{} exception: {}",resultBody, exception);
return resultBody;
}
}