package com.ydtech.aop; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotPermissionException; import com.ydtech.aop.exception.DescribeException; import com.ydtech.core.page.HttpResult; import com.ydtech.core.page.HttpStatus; import com.ydtech.exception.SystemException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DuplicateKeyException; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; 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.validation.ConstraintViolationException; import java.sql.SQLIntegrityConstraintViolationException; import java.util.List; @ControllerAdvice public class GlobalExceptionHandler { private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * 判断错误是否是已定义的已知错误,不是则由未知错误代替,同时记录在log中 * * @param e 异常 * @return */ @ExceptionHandler(value = Exception.class) @ResponseBody public HttpResult exceptionGet(Exception e) { LOGGER.error("【系统异常】{}", e); // if (e.getStackTrace() != null && e.getStackTrace().length > 0) { // StackTraceElement element = e.getStackTrace()[0]; // ErrorInfo errorInfo = new ErrorInfo( // element.getClassName(), // element.getFileName(), // element.getMethodName(), // String.valueOf(element.getLineNumber()) // ); // // return HttpResult.error(-9999, errorInfo.toString()); // } return HttpResult.error(-9999, "程序异常,请联系管理员"); } @ExceptionHandler(value = DescribeException.class) @ResponseBody public HttpResult describeExceptionHandle(DescribeException describeException) { return HttpResult.error(describeException.getCode(), describeException.getMessage()); } @ExceptionHandler(value = SystemException.class) @ResponseBody public HttpResult systemExceptionHandle(SystemException systemException) { return HttpResult.error(Integer.parseInt(systemException.getCode()), systemException.getMessage()); } @ExceptionHandler(value = MethodArgumentNotValidException.class) @ResponseBody public HttpResult methodArgumentNotValidExceptionHandle(MethodArgumentNotValidException methodArgumentNotValidException) { BindingResult bindingResult = methodArgumentNotValidException.getBindingResult(); List objectErrors = bindingResult.getAllErrors(); String message = objectErrors.get(0).getDefaultMessage(); return HttpResult.error(400, message); } @ExceptionHandler(value = DuplicateKeyException.class) @ResponseBody public HttpResult sqlExceptionHandle(SQLIntegrityConstraintViolationException sqlException) { return HttpResult.error("违反唯一约束:" + sqlException.getMessage() .substring(0, sqlException.getMessage().indexOf("for key"))); } @ExceptionHandler(value = ConstraintViolationException.class) @ResponseBody public HttpResult constraintViolation(ConstraintViolationException constraintViolationException) { return HttpResult.error(constraintViolationException.getMessage()); } @ExceptionHandler(value = NotLoginException.class) @ResponseBody public HttpResult notLoginException(NotLoginException e) { return HttpResult.error(HttpStatus.SC_UNAUTHORIZED, "未登录状态,无法访问。"); } @ExceptionHandler(value = NotPermissionException.class) @ResponseBody public HttpResult notPermissionException(NotPermissionException e) { return HttpResult.error(HttpStatus.SC_FORBIDDEN, "未获得权限,无法访问。"); } }