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<FieldError> 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<ConstraintViolation<?>> 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);
|
}
|
}
|