package cn.mb.cloud.auth.security.component; import cn.mb.cloud.common.core.constant.enums.ErrorCodeConstants; import cn.mb.cloud.common.core.exception.BusinessException; import cn.mb.cloud.common.core.util.ResponseData; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.SpringSecurityMessageSource; 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.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.List; /** * @author jason * 全局异常处理器 */ @Slf4j @RestControllerAdvice public class GlobalExceptionHandlerResolver { /** * 全局异常. * * @param e the e * @return R */ @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.OK) public ResponseData handleGlobalException(Exception e) { log.error("全局异常信息 ex={}", e.getMessage(), e); return ResponseData.builder() .msg(e.getLocalizedMessage()) .code(ErrorCodeConstants.FAIL.getValue()) .build(); } @ExceptionHandler(RuntimeException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public ResponseData runtimeException(RuntimeException e) { log.error("运行时异常信息" + e.getMessage(), e); return ResponseData.builder().code(ErrorCodeConstants.FAIL.getValue()).msg(e.getMessage()).build(); } @ExceptionHandler(BusinessException.class) @ResponseStatus(HttpStatus.OK) public ResponseData bussiness(BusinessException e) { log.error("业务异常 message= " + e.getMessage() + " code= " + e.getErrorCode(), e); return ResponseData.builder() .msg(e.getMessage()) .code(ErrorCodeConstants.FAIL.getValue()) .build(); } /** * AccessDeniedException * * @param e the e * @return R */ @ExceptionHandler(AccessDeniedException.class) @ResponseStatus(HttpStatus.FORBIDDEN) public ResponseData handleAccessDeniedException(AccessDeniedException e) { String msg = SpringSecurityMessageSource.getAccessor() .getMessage("AbstractAccessDecisionManager.accessDenied" , e.getMessage()); log.error("拒绝授权异常信息 ex={}", msg, e); return ResponseData.builder() .msg(msg) .code(ErrorCodeConstants.FAIL.getValue()) .build(); } /** * validation Exception * * @param exception * @return R */ @ExceptionHandler({MethodArgumentNotValidException.class, BindException.class}) @ResponseStatus(HttpStatus.BAD_REQUEST) public ResponseData handleBodyValidException(MethodArgumentNotValidException exception) { List fieldErrors = exception.getBindingResult().getFieldErrors(); log.error("参数绑定异常,ex = {}", fieldErrors.get(0).getDefaultMessage()); return ResponseData.builder() .msg(fieldErrors.get(0).getDefaultMessage()) .code(ErrorCodeConstants.FAIL.getValue()) .build(); } }