乐趣区

关于spring-boot-编程思想:SpringBoot-全局异常处理

为什么会有这篇文章

前后端拆散零碎,应用 SpringBoot 搭建后端。
心愿申请后果能够依照 HttpStatus 返回。
搜寻了不少对于 SpringBoot 的全局异样解决,大部分都是返回 200,再在音讯体中退出 code,感觉这样解决不符合规范,所以有了以下内容。

步骤

  1. 创立异样类
  2. 创立全局异样解决
  3. 异样应用下面创立的异样类抛出

代码

异样类 BizException
该异样类应用最简略构造,仅有状态码和自定义信息,可依据本人须要拓展。

import org.springframework.http.HttpStatus;

/**
 * 错误处理类
 */
public class BizException extends RuntimeException {

    private HttpStatus status;
    private String message;

    public BizException(HttpStatus status, String message) {super(message);
        this.status = status;
        this.message = message;
    }

    public BizException(HttpStatus status) {this(status, status.getReasonPhrase());
    }

    public HttpStatus getStatus() {return status;}

    @Override
    public String getMessage() {return message;}
}

全局异样解决 GlobalExceptionHandler
该类会依据抛出类型,主动进入对应解决类。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * 全局异样解决
 */
@ControllerAdvice
public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(value = BizException.class)
    @ResponseBody
    public ResponseEntity<Map<String, Object>> bizExceptionHandler(HttpServletRequest req, BizException e) {Map<String, Object> map = new HashMap<>();
        map.put("message", e.getMessage());
        return new ResponseEntity<>(map, e.getStatus());
    }

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseEntity<Map<String, Object>> exceptionHandler(HttpServletRequest req, Exception e) {Map<String, Object> map = new HashMap<>();
        map.put("message", e.getMessage());
        return new ResponseEntity<>(map, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

在任意想要的中央抛出 BizException 异样

throw new BizException(HttpStatus.UNAUTHORIZED);
throw new BizException(HttpStatus.UNAUTHORIZED,"未登录");

申请对应连贯,能够察看到状态码已变更为 401,并附有信息

参考资料:
小白的 springboot 之路(十)、全局异样解决 – 大叔杨 – 博客园
小白的 springboot 之路(十一)、构建后盾 RESTfull API
springboot 自定义 http 反馈状态码 – Boblim – 博客园

首发于知乎
SpringBoot 全局异样解决

退出移动版