package cc.mrbird.febs.common.handler; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.exception.FileDownloadException; import cc.mrbird.febs.common.exception.LimitAccessException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.authz.UnauthorizedException; import org.apache.shiro.session.ExpiredSessionException; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.Path; import java.util.List; import java.util.Set; /** * @author MrBird */ @Slf4j @RestControllerAdvice @Order(value = Ordered.HIGHEST_PRECEDENCE) public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) public FebsResponse handleException(Exception e) { log.error("系统内部异常,异常信息", e); return new FebsResponse().code(HttpStatus.INTERNAL_SERVER_ERROR).message("系统内部异常"); } @ExceptionHandler(value = FebsException.class) public FebsResponse handleFebsException(FebsException e) { log.error("系统错误", e); return new FebsResponse().code(HttpStatus.INTERNAL_SERVER_ERROR).message(e.getMessage()); } /** * 统一处理请求参数校验(实体对象传参-form) * * @param e BindException * @return FebsResponse */ @ExceptionHandler(BindException.class) public FebsResponse validExceptionHandler(BindException e) { StringBuilder message = new StringBuilder(); List fieldErrors = e.getBindingResult().getFieldErrors(); for (FieldError error : fieldErrors) { message.append(error.getField()).append(error.getDefaultMessage()).append(","); } message = new StringBuilder(message.substring(0, message.length() - 1)); return new FebsResponse().code(HttpStatus.BAD_REQUEST).message(message.toString()); } /** * 统一处理请求参数校验(普通传参) * * @param e ConstraintViolationException * @return FebsResponse */ @ExceptionHandler(value = ConstraintViolationException.class) public FebsResponse handleConstraintViolationException(ConstraintViolationException e) { StringBuilder message = new StringBuilder(); Set> violations = e.getConstraintViolations(); for (ConstraintViolation violation : violations) { Path path = violation.getPropertyPath(); String[] pathArr = StringUtils.splitByWholeSeparatorPreserveAllTokens(path.toString(), "."); message.append(pathArr[1]).append(violation.getMessage()).append(","); } message = new StringBuilder(message.substring(0, message.length() - 1)); return new FebsResponse().code(HttpStatus.BAD_REQUEST).message(message.toString()); } /** * 统一处理请求参数校验(json) * * @param e ConstraintViolationException * @return FebsResponse */ @ExceptionHandler(MethodArgumentNotValidException.class) public FebsResponse handlerMethodArgumentNotValidException(MethodArgumentNotValidException e) { StringBuilder message = new StringBuilder(); for (FieldError error : e.getBindingResult().getFieldErrors()) { message.append(error.getField()).append(error.getDefaultMessage()).append(","); } message = new StringBuilder(message.substring(0, message.length() - 1)); log.error(message.toString(), e); return new FebsResponse().code(HttpStatus.BAD_REQUEST).message(message.toString()); } @ExceptionHandler(value = LimitAccessException.class) public FebsResponse handleLimitAccessException(LimitAccessException e) { log.error("LimitAccessException", e); return new FebsResponse().code(HttpStatus.TOO_MANY_REQUESTS).message(e.getMessage()); } @ExceptionHandler(value = UnauthorizedException.class) public FebsResponse handleUnauthorizedException(UnauthorizedException e) { log.error("UnauthorizedException, {}", e.getMessage()); return new FebsResponse().code(HttpStatus.FORBIDDEN).message(e.getMessage()); } @ExceptionHandler(value = AuthenticationException.class) public FebsResponse handleAuthenticationException(AuthenticationException e) { log.error("AuthenticationException, {}", e.getMessage()); return new FebsResponse().code(HttpStatus.INTERNAL_SERVER_ERROR).message(e.getMessage()); } @ExceptionHandler(value = AuthorizationException.class) public FebsResponse handleAuthorizationException(AuthorizationException e){ log.error("AuthorizationException, {}", e.getMessage()); return new FebsResponse().code(HttpStatus.UNAUTHORIZED).message(e.getMessage()); } @ExceptionHandler(value = ExpiredSessionException.class) public FebsResponse handleExpiredSessionException(ExpiredSessionException e) { log.error("ExpiredSessionException", e); return new FebsResponse().code(HttpStatus.UNAUTHORIZED).message(e.getMessage()); } @ExceptionHandler(value = FileDownloadException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public void handleFileDownloadException(FileDownloadException e) { log.error("FileDownloadException", e); } }