package cc.mrbird.febs.common.core.handler; import cc.mrbird.febs.common.core.entity.FebsResponse; import cc.mrbird.febs.common.core.entity.constant.StringConstant; import cc.mrbird.febs.common.core.exception.FebsException; import cc.mrbird.febs.common.core.exception.FileDownloadException; import cc.mrbird.febs.common.core.utils.FebsUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; import org.springframework.web.HttpMediaTypeNotSupportedException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.Path; import java.util.List; import java.util.Set; /** * @author MrBird */ @Slf4j public class BaseExceptionHandler { @ExceptionHandler(value = Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public FebsResponse handleException(Exception e) { String message = FebsUtil.containChinese(e.getMessage()) ? e.getMessage() : "系统内部异常"; log.error(message, e); return new FebsResponse().message(message); } @ExceptionHandler(value = FebsException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public FebsResponse handleFebsException(FebsException e) { log.error("FEBS系统异常", e); return new FebsResponse().message(e.getMessage()); } /** * 统一处理请求参数校验(实体对象传参) * * @param e BindException * @return FebsResponse */ @ExceptionHandler(BindException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public FebsResponse handleBindException(BindException e) { StringBuilder message = new StringBuilder(); List fieldErrors = e.getBindingResult().getFieldErrors(); for (FieldError error : fieldErrors) { message.append(error.getField()).append(error.getDefaultMessage()).append(StringConstant.COMMA); } message = new StringBuilder(message.substring(0, message.length() - 1)); log.error(message.toString()); return new FebsResponse().message(message.toString()); } /** * 统一处理请求参数校验(普通传参) * * @param e ConstraintViolationException * @return FebsResponse */ @ExceptionHandler(value = ConstraintViolationException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) 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(StringConstant.COMMA); } message = new StringBuilder(message.substring(0, message.length() - 1)); log.error(message.toString()); return new FebsResponse().message(message.toString()); } /** * 统一处理请求参数校验(json) * * @param e ConstraintViolationException * @return FebsResponse */ @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public FebsResponse handlerMethodArgumentNotValidException(MethodArgumentNotValidException e) { StringBuilder message = new StringBuilder(); for (FieldError error : e.getBindingResult().getFieldErrors()) { message.append(error.getField()).append(error.getDefaultMessage()).append(StringConstant.COMMA); } message = new StringBuilder(message.substring(0, message.length() - 1)); log.error(message.toString()); return new FebsResponse().message(message.toString()); } @ExceptionHandler(value = FileDownloadException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public void handleFileDownloadException(FileDownloadException e) { log.error("FileDownloadException", e); } @ExceptionHandler(value = AccessDeniedException.class) @ResponseStatus(HttpStatus.FORBIDDEN) public FebsResponse handleAccessDeniedException() { return new FebsResponse().message("没有权限访问该资源"); } @ExceptionHandler(value = HttpMediaTypeNotSupportedException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public FebsResponse handleHttpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException e) { String message = "该方法不支持" + StringUtils.substringBetween(e.getMessage(), "'", "'") + "媒体类型"; log.error(message); return new FebsResponse().message(message); } @ExceptionHandler(value = HttpRequestMethodNotSupportedException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public FebsResponse handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { String message = "该方法不支持" + StringUtils.substringBetween(e.getMessage(), "'", "'") + "请求方法"; log.error(message); return new FebsResponse().message(message); } }