Spring Boot 全局异常拦截配置

对于一些报错,我们希望向前端返回一个错误提示结果,手动在报错后发送是很不方便的,我们可以定义一个【全局异常处理handler】来做这件事。

先来见见代码壳子:

1
2
3
4
5
6
@Slf4j
@ResponseBody
@RestControllerAdvice
public class GlobalExceptionHandler {
}

对于要监听的异常报错,我们这么处理:

1
2
3
4
5
6
7
8
9
// 指定拦截的异常类,要求继承自 RuntimeException
@ExceptionHandler(BadRequestException.class)
// 定义 http 响应状态码,必须是 HttpStatus 枚举,如示例为 400
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Result<String> badRequestException(BadRequestException e) {
// 方法体内可以写该异常发生后要处理的事,比如自定义错误提示响应
log.error("400 BadRequest: {}", e.getMessage());
return Result.error(400, e.getMessage());
}

示例中的响应体结构代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**
* 通用返回结果类,服务端响应的数据最终都会封装成此对象
*
* @param <T>
* @author Amane64
*/
@Data
public class Result<T> {
/**
* 状态码
*/
private Integer code;
/**
* 错误信息
*/
private String msg;
/**
* 数据体
*/
private T data;

/**
* 成功回调
*
* @param data 数据体
* @param <T> 回调类型
* @return 成功回调数据
*/
public static <T> Result<T> success(T data) {
var result = new Result<T>();
result.data = data;
result.msg = "success";
result.code = 200;
return result;
}

/**
* 成功回调(无数据)
*/
public static <T> Result<T> success() {
var result = new Result<T>();
result.data = null;
result.msg = "success";
result.code = 200;
return result;
}

/**
* @param msg 错误信息
* @param <T> 空回调类型
* @return 空回调
*/
public static <T> Result<T> error(int code, String msg) {
var result = new Result<T>();
result.code = code;
result.msg = msg;
return result;
}
}