SpringBoot项目实战经验之@ControllerAdvice+@ExceptionHandler实现全局异常统一处理

此文章已同步更新至我的个人博客https://simonting.gitee.io


注解

@ControllerAdvice(或@RestControllerAdvice)

本质上是Component,会被当做组件扫描。一般配合@InitBinder、@ModelAttribute、@ExceptionHandler来使用,实现以下三个方面的功能:
1、全局数据预处理
2、全局数据绑定
3、全局异常处理
今天我们主要介绍第三种功能,在平时的项目中使用的比较广泛,可以实现在后台业务处理时抛出自定义错误,传回前台,此时前台就可以友好的将错误提示给用户。
源码

@ExceptionHandler(“异常类名”)

被此注解修饰的方法会在系统抛出在括号中定义的异常时自动触发。
如下面的用例中,当系统抛出自定义异常MyException时,会自动触发handlerError()方法,将错误码与错误信息封装好返回给前台。

代码

自定义异常基类

继承自RuntimeException

@Data
public class MyException extends RuntimeException {
    private String errorMsg;

    private int errorCode;

    public MyException(int errorCode,String errorMsg){
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

}

统一异常处理类

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MyException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ErrorResult handlerError(MyException ex) {
        ErrorResult errorResult = new ErrorResult();
        errorResult.setErrorCode(ex.getErrorCode());
        errorResult.setErrorMsg(ex.getErrorMsg());
        return errorResult;
    }
}

封装的返回实体类

@Data
@ToString
public class ErrorResult {

    private int errorCode;

    private String errorMsg;
}

测试

@RestController("/")
public class TestController {

    @RequestMapping(method = RequestMethod.GET, path = {"/test"})
    public ResponseEntity<?> test(@RequestParam String id) {
        if (StringUtils.isEmpty(id)) {
            throw new MyException(500, "id不能为空");
        }
        return new ResponseEntity<>(null, HttpStatus.OK);
    }

}

测试结果

测试结果

项目结构

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值