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 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) { log.error("系统内部异常,异常信息", e); return new FebsResponse().message("系统内部异常"); } @ExceptionHandler(value = FebsException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public FebsResponse handleFebsException(FebsException e) { log.error("系统错误", 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(","); } message = new StringBuilder(message.substring(0, message.length() - 1)); 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(","); } message = new StringBuilder(message.substring(0, message.length() - 1)); 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(","); } message = new StringBuilder(message.substring(0, message.length() - 1)); log.error(message.toString(), e); 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) { return new FebsResponse().message("改方法不支持" + StringUtils.substringBetween(e.getMessage(), "'", "'") + "媒体类型"); } @ExceptionHandler(value = HttpRequestMethodNotSupportedException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public FebsResponse handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { return new FebsResponse().message("该方法不支持" + StringUtils.substringBetween(e.getMessage(), "'", "'") + "请求方法"); } }