package com.sandu.common.execption; import cn.hutool.core.exceptions.ExceptionUtil; import com.sandu.common.domain.ResponseVO; import com.sandu.common.enums.ResponseStatusEnums; import com.sandu.common.util.ResponseUtil; import com.sandu.common.util.ThrowableUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.authentication.AccountStatusException; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.InternalAuthenticationServiceException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.Objects; /** * 全局异常捕捉 * * @author chenjiantian */ @Slf4j @RestControllerAdvice @SuppressWarnings("unchecked") public class GlobalExceptionHandler { /** * 处理所有不可知的异常 */ @ExceptionHandler(Throwable.class) public ResponseVO handleException(Throwable e) { // 打印堆栈信息 log.error(ThrowableUtil.getStackTrace(e)); return ResponseUtil.error(ResponseStatusEnums.SERVER_ERROR.getCode(), ResponseStatusEnums.SERVER_ERROR.getMessage(), null, ExceptionUtil.stacktraceToOneLineString(e)); } /** * BadCredentialsException */ @ExceptionHandler({BadCredentialsException.class, InternalAuthenticationServiceException.class}) public ResponseVO badCredentialsException(Exception e) { // 打印堆栈信息 // String message = "坏的凭证".equals(e.getMessage()) ? "用户名或密码不正确" : e.getMessage(); // log.error(ExceptionUtil.stacktraceToOneLineString(e)); return ResponseUtil.error(ResponseStatusEnums.BAD_CREDENTIALS.getCode(), ResponseStatusEnums.BAD_CREDENTIALS.getMessage(), null); } /** * AccountStatusException */ @ExceptionHandler(AccountStatusException.class) public ResponseVO accountStatusException(AccountStatusException e) { return ResponseUtil.error(ResponseStatusEnums.DISABLE_ACCOUNT.getCode(), ResponseStatusEnums.DISABLE_ACCOUNT.getMessage(), null); } /** * @return '@PreAuthorize' 注解的异常,抛出AccessDeniedException异常,不会被accessDeniedHandler捕获,而是会被全局异常捕获。 */ @ExceptionHandler(AccessDeniedException.class) public ResponseVO handleAccessDeniedException(AccessDeniedException e) { return ResponseUtil.error(ResponseStatusEnums.FORBIDDEN.getCode(), ResponseStatusEnums.FORBIDDEN.getMessage(), null); } /** * 处理自定义异常 */ @ExceptionHandler(value = BusinessException.class) public ResponseVO badRequestException(BusinessException e) { // 打印堆栈信息 // log.error(ThrowableUtil.getStackTrace(e)); return ResponseUtil.error(e.getCode(), e.getMessage(), e.getData()); } /** * 处理 EntityExist */ @ExceptionHandler(value = EntityExistException.class) public ResponseVO entityExistException(EntityExistException e) { // 打印堆栈信息 // log.error(ThrowableUtil.getStackTrace(e)); return ResponseUtil.error(ResponseStatusEnums.FAIL.getCode(), e.getMessage(), null); } /** * 处理所有接口数据验证异常 */ @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { // 打印堆栈信息 // log.error(ThrowableUtil.getStackTrace(e)); String[] str = Objects.requireNonNull(e.getBindingResult().getAllErrors().get(0).getCodes())[1].split("\\."); String message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage(); String msg = "不能为空"; if (msg.equals(message)) { message = str[1] + ":" + message; } return ResponseUtil.error(ResponseStatusEnums.FAIL.getCode(), message, null); } }