欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring-全局异常拦截

程序员文章站 2022-04-13 13:39:23
Spring MVC那一篇里提到了异常拦截来做参数校验返回,那里是对特定的 controller 做异常捕捉,但是我们也可以选择全局拦截处理 快速开始 @ResponseBody @ControllerAdvice public class ExceptionAdvice { private sta ......

spring mvc那一篇里提到了异常拦截来做参数校验返回,那里是对特定的 controller 做异常捕捉,但是我们也可以选择全局拦截处理

快速开始

@responsebody
@controlleradvice
public class exceptionadvice {
    private static logger logger = loggerfactory.getlogger(exceptionadvice.class);

    /***
    * 参数绑定异常
    * @date 2018/10/16
    * @param exception httpmessagenotreadableexception
    */
    @responsestatus(httpstatus.bad_request)
    @exceptionhandler(httpmessagenotreadableexception.class)
    public result<long> messagenotreadable(httpmessagenotreadableexception exception){
        invalidformatexception formatexception = (invalidformatexception)exception.getcause();
        list<jsonmappingexception.reference> e = formatexception.getpath();
        string fieldname = "";
        for (jsonmappingexception.reference reference :e){
            string fieldname = reference.getfieldname();
        }
        logger.error("参数不匹配"+exception);
        return result.createfailresult(fieldname+"参数类型不匹配");
    }

    /***
    * 全局异常,如果没有匹配到上述准确的异常,都会到这里来处理
    * @date 2018/10/16
    * @param e 没有匹配到的全局异常
    */
    @responsestatus(httpstatus.bad_request)
    @exceptionhandler(exception.class)
    public result<string> all(exception e){
        //这里的log使用了“,”,这样能把异常的堆栈信息全部打印出来,更容易定位bug
        logger.error("异常:",e);
        return result.createfailresult("工程抢救中……请稍后再试");
    }
}

@controlleradvice

@controlleradvice 默认监控所有的 @requestmapping 方法,也可以对指定过滤的条件:

// 监控所有的被@restcontroller注解的controllers类 
@controlleradvice(annotations = restcontroller.class)

// 监控特定的包下的controllers类
@controlleradvice("org.example.controllers")

// 监控指定类的controllers类
@controlleradvice(assignabletypes = {controllerinterface.class, abstractcontroller.class})