SpringBoot优雅的全局异常处理

SpringBoot优雅的全局异常处理

  • 导入依赖

    <!--fastjson-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.41</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    
  • 自定义数据格式

    后台返回统一数据格式

    //保证序列化Json的时候,如果是null的对象,key也会消失
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class ResponseResult<T> implements Serializable{
        private int status;
    
        private String msg;
    
        private  T data;
    
        private ResponseResult(int status)
        {
            this.status = status;
        }
        private ResponseResult(int status, T data)
        {
            this.status = status;
            this.data = data;
        }
        private ResponseResult(int status, String msg, T data)
        {
            this.status = status;
            this.msg = msg;
            this.data = data;
        }
        private ResponseResult(int status, String msg)
        {
            this.status = status;
            this.msg = msg;
        }
    
    
        public int getStatus() {
            return status;
        }
    
        //使之不在json序列化结果当中
        @JsonIgnore
        public Boolean isSuccess()
        {
            return this.status == ResponseCode.SUCCESS.getCode();
        }
    
        public String getMsg() {
            return msg;
        }
    
        public T getData() {
            return data;
        }
    
        public static <T> ResponseResult<T> createBySuccess()
        {
            return  new ResponseResult<T>(ResponseCode.SUCCESS.getCode());
        }
    
        public static <T> ResponseResult<T> createBySuccessMessage(String msg)
        {
            return new ResponseResult<T>(ResponseCode.SUCCESS.getCode(),msg);
        }
    
        public static <T> ResponseResult<T> createBySuccess(T data)
        {
            return new ResponseResult<T>(ResponseCode.SUCCESS.getCode(),data);
        }
    
        public static <T> ResponseResult<T> createBySuccess(String msg, T data)
        {
            return  new ResponseResult<T>(ResponseCode.SUCCESS.getCode(),msg,data);
        }
        /******************errorMsg************************/
    
        public static <T> ResponseResult<T> createByError()
        {
            return  new ResponseResult<T>(ResponseCode.SUCCESS.getCode(),ResponseCode.ERROR.getDesc());
        }
        public static <T> ResponseResult<T> createByErrorMessage(String errorMsg)
        {
            return new ResponseResult<T>(ResponseCode.ERROR.getCode(),errorMsg);
        }
        public static <T> ResponseResult<T> createByErrorMessage(int errorCode, String errorMessage)
        {
            return new ResponseResult<T>(errorCode,errorMessage);
        }
    
    }
    
    
  • 自定义枚举类

    统一定义返回数据的格式中的code和message的值

    public enum  ResponseCode {
      
        NEED_LOGIN(10,"NEED LOGIN"),
        ILLEGAL_ARGUMENT(2,"ILLEGAL ARGUMENT"),
        SUCCESS(200, "成功!"),
        BODY_NOT_MATCH(400,"请求的数据格式不符!"),
        SIGNATURE_NOT_MATCH(401,"请求的数字签名不匹配!"),
        NOT_FOUND(404, "未找到该资源!"),
        INTERNAL_SERVER_ERROR(500, "服务器内部错误!"),
        SERVER_BUSY(503,"服务器正忙,请稍后再试!");
    
        private final String desc;
        private final int code;
    
        ResponseCode(int code,String desc){
            this.code = code;
            this.desc = desc;
        }
    
        public String getDesc() {
            return desc;
        }
    
        public int getCode() {
            return code;
        }
    }
    
  • 自定义异常类

    @Data
    public class BizException extends  RuntimeException {
    
        private static final Long serialVersionUID = 1L;
    
        /**
         * 错误码
         */
        private int errorCode;
    
        /**
         * 错误信息
         */
        private String errorMessage;
    
        public BizException(String errorMessage) {
            super(errorMessage);
            this.errorMessage = errorMessage;
        }
    
        public BizException(String errorMessage, Throwable cause) {
            super(errorMessage, cause);
            this.errorMessage = errorMessage;
        }
    
        public BizException(int errorCode, String errorMessage) {
            super(errorMessage);
            this.errorMessage = errorMessage;
            this.errorCode = errorCode;
        }
    
        public BizException(int errorCode, String errorMessage, Throwable cause) {
            super(errorMessage,cause);
            this.errorMessage = errorMessage;
            this.errorCode = errorCode;
        }
    }
    
  • 全局异常处理类

    @RestControllerAdvice
    @Slf4j
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(BizException.class)
        public ResponseResult handleBizException(BizException e)
        {
           return ResponseResult.createByErrorMessage(e.getErrorCode(),e.getErrorMessage());
        }
    
        /**
         * 处理其他异常
         * @param req
         * @param e
         * @return
         */
        @ExceptionHandler(value =Exception.class)
        @ResponseBody
        public ResponseResult exceptionHandler(HttpServletRequest req, Exception e) {
            log.error("未知异常!原因是:", e);
            return ResponseResult.createByErrorMessage(ResponseCode.ILLEGAL_ARGUMENT.getDesc());
    
        }
    }
    

测试

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/login")
    public void login()
    {
        throw new BizException(ResponseCode.INTERNAL_SERVER_ERROR.getCode(),ResponseCode.INTERNAL_SERVER_ERROR.getDesc());
    }

}
原文地址:https://www.cnblogs.com/seanRay/p/14985741.html