当前位置: 首页 > news >正文

SpringMVC设置全局异常处理器

文章目录

  • 背景
  • 分析
    • 使用@ControllerAdvice(@RestControllerAdvice)+@ExceptionHandler实现全局异常
    • 全局异常处理-多个处理器匹配顺序
      • 存在一个类中
      • 存在不同的类中
  • 对于过滤器和拦截器中的异常,有两种思路可以考虑

背景

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

参考:官方文档

分析

首先 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() 直接写错误信息)
如:

     @Overridepublic 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;}}

相关文章:

  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • 蓝桥杯-卡片换位
  • 设计模式学习笔记 - 设计模式与范式 -结构型:7.享元模式(上):享元模式原理和应用
  • Web Components使用(一)
  • 【ZZULIOJ】1014: 求三角形的面积(Java)
  • 网络工程师实验命令(华为数通HCIA)
  • 机器学习_集成学习_梯度提升_回归_决策树_XGBoost相关概念
  • 初识C++之命名空间(namespace)
  • Java中如何恰当的表达“继承”与“扩展”的语义?
  • docker 部署 gitlab-ce 16.9.1
  • vim分屏命令
  • 包子凑数(蓝桥杯,闫氏DP分析法)
  • C#-COM组件
  • unity双层滑动实现
  • Java八股文(JVM)
  • 自己简单写的 事件订阅机制
  • CentOS 7 修改主机名
  • express + mock 让前后台并行开发
  • flutter的key在widget list的作用以及必要性
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • javascript面向对象之创建对象
  • JavaScript设计模式之工厂模式
  • Linux链接文件
  • Mysql优化
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • python3 使用 asyncio 代替线程
  • Python学习之路13-记分
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Sass Day-01
  • SpiderData 2019年2月13日 DApp数据排行榜
  • springboot_database项目介绍
  • SpriteKit 技巧之添加背景图片
  • text-decoration与color属性
  • 从0到1:PostCSS 插件开发最佳实践
  • 新手搭建网站的主要流程
  • #Lua:Lua调用C++生成的DLL库
  • #Spring-boot高级
  • #Ubuntu(修改root信息)
  • ${ }的特别功能
  • (10)STL算法之搜索(二) 二分查找
  • (175)FPGA门控时钟技术
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (3)选择元素——(17)练习(Exercises)
  • (4)事件处理——(7)简单事件(Simple events)
  • (C++17) std算法之执行策略 execution
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (论文阅读40-45)图像描述1
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)memcache、redis缓存
  • . NET自动找可写目录
  • ../depcomp: line 571: exec: g++: not found