SpringMVC设置全局异常处理器的步骤

 更新时间:2024年03月29日 14:27:05   作者:水岸齐天  
在项目中我们有需求做一个全局异常处理,来规范所有出去的异常信息,这篇文章主要介绍了SpringMVC设置全局异常处理器,需要的朋友可以参考下

背景

在项目中我们有需求做一个全局异常处理,来规范所有出去的异常信息。

参考:官方文档

分析

首先 ControllerAdvice(RestControllerAdvice ) ,ControllerAdvice 是无法处理过滤器和拦截器中的异常的。

引用一张图

下面介绍controller层的全局异常设置

全局异常处理也有多种方式

使用@ControllerAdvice(@RestControllerAdvice)+@ExceptionHandler实现全局异常

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 处理参数错误的异常
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = IllegalParamsException.class)
    public ResultVO<Object> handleIllegalParamsException(IllegalParamsException e) {
        ResultVO<Object> resultVo = new ResultVO<>();
        resultVo.setStatus(HttpStatus.BAD_REQUEST.value());
        resultVo.setErrorCode(e.getErrorInfo().getErrorCode());
        resultVo.setErrorMsg(e.getErrorInfo().getErrorDesc());
        return resultVo;
    }
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public ResultVO<Object> handleException(Exception e) {
        ResultVO<Object> resultVo = new ResultVO<>();
        resultVo.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        resultVo.setErrorMsg(e.getMessage());
        return resultVo;
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultVO<T> {
    private Integer status;
    private String errorCode;
    private String errorMsg;
    private T data;
    public ResultVO(Integer status, String errorCode, String errorMsg) {
        this.status = status;
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }
}
public class IllegalParamsException extends RuntimeException {
    private static final long serialVersionUID = -6298406656682893468L;
    private OperationErrorEnum errorInfo;
    public IllegalParamsException(OperationErrorEnum errorInfo) {
        this.errorInfo = errorInfo;
    }
    public IllegalParamsException(String message, OperationErrorEnum errorInfo) {
        super(message);
        this.errorInfo = errorInfo;
    }
    public IllegalParamsException(String message, Throwable cause, OperationErrorEnum errorInfo) {
        super(message, cause);
        this.errorInfo = errorInfo;
    }
    public IllegalParamsException(Throwable cause, OperationErrorEnum errorInfo) {
        super(cause);
        this.errorInfo = errorInfo;
    }
    public IllegalParamsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, OperationErrorEnum errorInfo) {
        super(message, cause, enableSuppression, writableStackTrace);
        this.errorInfo = errorInfo;
    }
    public OperationErrorEnum getErrorInfo() {
        return errorInfo;
    }
}

全局异常处理-多个处理器匹配顺序

参考:参考

多个处理器的两种情况:

存在一个类中

子类异常处理器优先

存在不同的类中

与多个异常处理类放入LinkedHashMap的顺序有关,
可以利用Order指定顺序,如果没有,则默认最小顺序;

那么,如果都没有指定顺序的话,那就是list中的顺序

对于过滤器和拦截器中的异常,有两种思路可以考虑

1、catch后通过转发到异常页面(设置ModelAndView)
参考:参考

2、拦截器中发生异常,拦截器中直接返回错误(通过response.getOutputStream().write() 直接写错误信息)
如:

         @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     try {
     // 业务代码
 } catch (Exception e) {
            response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
            ResultVO<Object> resultVo = new ResultVO<>();
            resultVo.setStatus(HttpStatus.UNAUTHORIZED.value());
            resultVo.setErrorMsg(ACCESS_PARAM_ERROR.getErrorDesc());
            response.getOutputStream().write(new String(JSON.toJSONString(resultVo)).getBytes(StandardCharsets.UTF_8));
            logger.error("==== WhiteListAndAuthenticationInterceptor拦截器拦截到了方法:{} 解析鉴权参数异常  ====", methodName);
            return false;
        }
    }

到此这篇关于SpringMVC设置全局异常处理器的步骤的文章就介绍到这了,更多相关SpringMVC全局异常处理器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单了解Spring Cloud Alibaba相关知识

    简单了解Spring Cloud Alibaba相关知识

    这篇文章主要介绍了简单了解Spring Cloud Alibaba相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Mybatis-plus使用wrapper多表内连接左连接查询方式

    Mybatis-plus使用wrapper多表内连接左连接查询方式

    文章介绍了使用MyBatis-Plus扩展包进行多表查询的方法,首先,通过DAO层使用注解和自定义SQL段实现关联查询;其次,在Service层通过QueryWrapper添加查询条件;最后在Controller层实现数据控制
    2025-10-10
  • Mybatis-Plus多表关联查询的使用案例解析

    Mybatis-Plus多表关联查询的使用案例解析

    这篇文章主要介绍了Mybatis-Plus多表关联查询的使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Idea设置spring boot应用配置参数的两种方式

    Idea设置spring boot应用配置参数的两种方式

    本文通过两个方式介绍Idea设置spring boot应用配置参数,一种是配置VM options的参数时要以:-DparamName的格式设置参数,第二种可以参考下本文详细设置,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • 揭秘SpringBoot!一分钟教你实现配置的动态神刷新

    揭秘SpringBoot!一分钟教你实现配置的动态神刷新

    在今天的指南中,我们将深入探索SpringBoot 动态刷新的强大功能,让你的应用保持最新鲜的状态,想象一下,无需重启,你的应用就能实时更新配置,是不是很酷?跟我一起,让我们揭开这项技术如何让开发变得更加灵活和高效的秘密吧!
    2024-03-03
  • 必须了解的高阶JAVA枚举特性!

    必须了解的高阶JAVA枚举特性!

    这篇文章主要介绍了必须了解的高阶JAVA枚举特性!帮助大家更好的理解和学习Java枚举的相关知识,感兴趣的朋友可以了解下
    2021-01-01
  • Java如何通过枚举实现有限状态机

    Java如何通过枚举实现有限状态机

    这篇文章主要介绍了Java如何通过枚举实现有限状态机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 解决java-jar报错:xxx.jar 中没有主清单属性的方法

    解决java-jar报错:xxx.jar 中没有主清单属性的方法

    在使用 java -jar xxx.jar 命令运行 Java 应用程序时,遇到了以下错误:xxx.jar 中没有主清单属性,这个错误表示 JAR 文件缺少必要的启动信息,本文将介绍该错误的原因以及如何通过修改 pom.xml 文件来解决,需要的朋友可以参考下
    2024-11-11
  • 解决spirngboot连接redis报错:READONLY You can‘t write against a read only replica的问题

    解决spirngboot连接redis报错:READONLY You can‘t write against 

    docker部署的redis,springboot基本每天来连redis都报错:READONLY You can't write against a read only replica,重启redis后,可以正常连接。但是每天都重启redis,不现实,也很麻烦,今天给大家分享解决方式,感兴趣的朋友一起看看吧
    2023-06-06
  • jvm排查工具箱jvm-tools下载使用详解

    jvm排查工具箱jvm-tools下载使用详解

    这篇文章主要为大家介绍了jvm排查工具箱jvm-tools下载使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论