什么是Spring Boot的统一异常处理类
在web开发中,不可避免会出现各种异常,如果没有好的异常处理机制,就会导致程序的崩溃,甚至影响用户体验。Spring Boot提供了一个通用的异常处理类,可以让我们处理所有的异常,而不必每个地方都写一遍异常处理代码。
如何编写Spring Boot的统一异常处理类
创建一个统一异常处理类
在Spring Boot中,我们可以通过实现@ControllerAdvice
注解和@ExceptionHandler
注解来自定义异常处理类。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Result handleException(Exception e){
log.error("系统异常:",e);
return new Result(ResultCode.FAILURE,"系统异常,请稍后再试");
}
}
@ControllerAdvice
注解标记全局异常处理类,@ExceptionHandler
注解指定处理异常的类型,并且方法的返回类型为Result
,@ResponseBody
注解可以将返回值转换为JSON格式返回给客户端。
异常返回值的封装
考虑到多个方法都有返回结果,我们可以封装一个通用的Result
类来代表接口的统一返回值,这样可以减少重复的代码,方便管理和维护。
public class Result {
private String code;
private String message;
private Object data;
public Result() {
}
public Result(ResultCode resultCode) {
this.code = resultCode.getCode();
this.message = resultCode.getMessage();
}
public Result(ResultCode resultCode, Object data) {
this.code = resultCode.getCode();
this.message = resultCode.getMessage();
this.data = data;
}
//getter and setter
}
ResultCode
是一个枚举类,表示不同的返回状态码和信息。
public enum ResultCode {
SUCCESS("200", "成功"),
FAILURE("400", "失败"),
UNAUTHORIZED("401", "未认证(签名错误)"),
NOT_FOUND("404", "接口不存在"),
INTERNAL_SERVER_ERROR("500", "服务器内部错误"),
PARAMETER_ERROR("10001", "参数错误");
private String code;
private String message;
ResultCode(String code, String message) {
this.code = code;
this.message = message;
}
//getter
}
测试统一异常处理类
编写一个Controller来抛出异常并测试自定义的异常处理器是否生效。
@RestController
@Slf4j
public class TestController {
@GetMapping("/test")
public void test() throws Exception{
log.info("test方法被调用");
throw new Exception("test方法发生异常");
}
}
启动项目,请求/test接口,会得到如下异常结果:
{
"code": "400",
"message": "系统异常,请稍后再试",
"data": null
}
可以看到,我们定义的通用异常处理器已经生效了。
总结
Spring Boot的统一异常处理类是一种非常方便的机制,可以极大的简化我们代码中的异常处理逻辑,提高了代码复用性和可读性,特别是对于大型项目,非常实用。