|
|
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<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();
|
log.error("参数绑定异常,ex = {}", fieldErrors.get(0).getDefaultMessage());
|
return ResponseData.builder()
|
.msg(fieldErrors.get(0).getDefaultMessage())
|
.code(ErrorCodeConstants.FAIL.getValue())
|
.build();
|
}
|
}
|