跳至主要內容

SpringBoot全局异常处理

言午日尧耳总大约 2 分钟JavaSpringBoot异常处理

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,并附有信息 1599578973.png

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

首发于知乎 SpringBoot 全局异常处理open in new window

上次编辑于:
贡献者: 许晓聪