SpringBoot全局异常处理
大约 2 分钟
SpringBoot全局异常处理
介绍
- 前后端分离系统,使用SpringBoot搭建后端。
- 希望请求结果可以按照HttpStatus返回。
- 搜索了不少关于SpringBoot的全局异常处理,大部分都是返回200,再在消息体中加入code,感觉这样处理不符合规范,所以有了以下内容。
步骤
- 创建异常类
- 创建全局异常处理
- 异常使用上面创建的异常类抛出
代码
异常类 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 APIspringboot自定义http反馈状态码 - Boblim - 博客园
首发于知乎 SpringBoot 全局异常处理