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> bizExceptionHandler(HttpServletRequest req, BizException e) {
        Map map = new HashMap<>();
        map.put("message", e.getMessage());
        return new ResponseEntity<>(map, e.getStatus());
    }

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseEntity> exceptionHandler(HttpServletRequest req, Exception e) {
        Map 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 全局异常处理_第1张图片

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

首发于知乎
SpringBoot 全局异常处理

你可能感兴趣的:(前后端分离,异常处理)