Spring全局异常处理HandlerExceptionResolver使用

news/2024/9/18 23:24:27/ 标签: spring, java, 全局异常处理

1 引言

全局异常处理在项目中经常会用到,主要作用包括统一处理异常、提供友好的错误信息、避免应用程序崩溃、记录异常日志、避免异常信息泄露等等。下文将以实现HandlerExceptionResolver接口的方式,实现全局异常处理功能及常规用法。

2 代码

下面列出几个关键文件进行介绍,源码链接在文章最后。
在这里插入图片描述

2.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zeroone</groupId><artifactId>zeroone</artifactId><version>1.0</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!--  为Spring Boot项目提供一系列默认的配置和依赖管理--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.2</version><relativePath/></parent><dependencies><!--  Spring Boot核心依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- Spring Boot单元测试和集成测试的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Spring Boot构建Web应用程序的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mysql驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!-- mybatis-plus核心依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version></dependency><!-- 阿里数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.23</version></dependency><!-- 阿里JSON解析库--><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.52</version></dependency></dependencies></project>

java_78">2.2 ReturnObj.java

该类主要用于构建一个统一的返回结构和返回状态码。

package com.zeroone.entity.common;import java.util.HashMap;
import java.util.Map;/*** 统一返回结构和返回状态码*/
public class ReturnObj {/*** 正常*/public static final int SUCCESS_CODE = 200;/*** 参数异常*/public static final int BAD_REQUEST_CODE = 400;/*** 未授权*/public static final int UNAUTHORIZED_CODE = 401;/*** 系统异常*/public static final int ERROR_CODE = 500;private static final String SUCCESS_MSG = "操作成功";public static Map<String, Object> build(int code, String msg, Object data) {Map<String, Object> map = new HashMap<>();map.put("code", code);map.put("msg", msg);map.put("data", data);return map;}public static Map<String, Object> success() {return build(SUCCESS_CODE, SUCCESS_MSG, null);}public static Map<String, Object> success(Object data) {return build(SUCCESS_CODE, SUCCESS_MSG, data);}public static Map<String, Object> success(String msg, Object data) {return build(SUCCESS_CODE, msg, data);}}

java_135">2.3 UserController.java

主要用于测试

package com.zeroone.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zeroone.config.exception.MyRuntimeException;
import com.zeroone.entity.User;
import com.zeroone.entity.common.ReturnObj;
import com.zeroone.mapper.master.UserMapperMaster;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Controller
@RequestMapping("/UserController")
public class UserController {@Autowiredprivate UserMapperMaster userMapperMaster;@RequestMapping(value = "/login")@ResponseBodypublic Object login(@RequestBody User user) {if (null == user.getPhone() ) {throw new MyRuntimeException(ReturnObj.BAD_REQUEST_CODE, "手机号不能为空");}user.getName().toString();return ReturnObj.success();}
}

java_178">2.4 MyRuntimeException.java

自定义异常,主要用code和msg来区分各种异常场景,无需每种异常都建一个类。

package com.zeroone.config.exception;/*** 自定义异常*/
public class MyRuntimeException extends RuntimeException {/*** 异常码*/private int code;/*** 异常消息*/private String msg;public MyRuntimeException(int code, String msg) {super(msg);this.code = code;this.msg = msg;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

java_225">2.5 HandlerExceptionResolverImpl.java

全局异常处理,只需要实现HandlerExceptionResolver 接口,所有抛出的异常都会调用resolveException方法。在此方法中,根据不同的异常类型,做不同的处理,以达到灵活处理异常的目的。

package com.zeroone.config.exception;import com.alibaba.fastjson2.JSON;
import com.zeroone.entity.common.ReturnObj;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;import java.io.IOException;
import java.io.PrintWriter;/*** 全局异常处理器*/
@Component
public class HandlerExceptionResolverImpl implements HandlerExceptionResolver {public final Logger log = LoggerFactory.getLogger(getClass());@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {response.setStatus(HttpStatus.OK.value()); // 设置状态码response.setCharacterEncoding("UTF-8"); // 设置编码int code = ReturnObj.ERROR_CODE;String msg = "系统异常";// if 自定义异常// else 其他异常if (ex instanceof MyRuntimeException myEx) {code = myEx.getCode();msg = myEx.getMsg();} else {msg = ex.getMessage();}log.error("Exception is ", ex);try {PrintWriter writer = response.getWriter();writer.print(JSON.toJSONString(ReturnObj.build(code, msg, null)));writer.flush();} catch (IOException e) {log.error("Exception is ", e);}return new ModelAndView();}
}

3 测试

  • 启动项目访问:http://localhost:8080/UserController/login,参数phone为null时,触发自定义异常,可以看到返回了自定义的数据,可用于验证参数非空等场景。

在这里插入图片描述在这里插入图片描述 * 启动项目访问:http://localhost:8080/UserController/login,参数phone有值时,触发系统异常,可以看到返回了自定义的数据,可用于快速定位代码问题,或者给用户进行统一友好提示。
在这里插入图片描述在这里插入图片描述

5 源码

Gitee代码链接


http://www.ppmy.cn/news/1520687.html

相关文章

搜维尔科技:蹦床、跳绳或骑马,OptiTrack可以捕捉难以想象的物体

蹦床、跳绳或骑马&#xff0c;OptiTrack可以捕捉难以想象的物体 搜维尔科技&#xff1a;蹦床、跳绳或骑马&#xff0c;OptiTrack可以捕捉难以想象的物体

Eureka简介与开发

Eureka 是由 Netflix 开源的服务发现和注册中心&#xff0c;它提供了服务的注册与发现功能&#xff0c;是 Spring Cloud 体系中的核心组件之一。Eureka 采用 C/S 架构&#xff0c;包含 Eureka Server 和 Eureka Client 两个主要的组件。 **Eureka Server** 充当服务注册中心&a…

读懂以太坊源码(3)-详细解析genesis.json

要想搞懂以太坊的源代码逻辑&#xff0c;必须要了解以太坊创世区块配置文件(genesis.json)的结构&#xff0c;以及每个配置参数的意义&#xff0c;创世配置文件&#xff0c;主要作用是设置链的ID&#xff0c;指定以太坊网络中硬分叉发生的区块高度&#xff0c;以及初始ETH数量的…

DuplicateKeyException产生原因及解决方案

DuplicateKeyException 是 Spring 框架中与数据库操作相关的异常之一&#xff0c;通常在试图向数据库中插入一条记录时&#xff0c;违反了唯一性约束&#xff08;如主键或唯一索引约束&#xff09;时抛出。这意味着数据库中已经存在具有相同键值的记录&#xff0c;导致插入操作…

小程序中用于跳转页面的5个api是什么?区别是什么

小程序中用于跳转页面的5个主要API分别是wx.navigateTo、wx.redirectTo、wx.reLaunch、wx.switchTab和wx.navigateBack。这些API各自具有不同的功能和特点&#xff0c;适用于不同的页面跳转场景。以下是它们的详细介绍及区别&#xff1a; 1. wx.navigateTo 功能&#xff1a;保…

认识爬虫技术

爬虫目的 网络爬虫&#xff0c;主要目的是代替人工收集网络数据。 应用场景主要包括两个方面&#xff1a; 网页收集的数据量少&#xff0c;但重复操作频率高&#xff1b; 通过网页搜集数据的量大。 只要满足以上两个应用场景&#xff0c;其实都可以考虑使用爬虫技术降低人…

TCP协议 配合 Wireshark 分析数据

在TCP连接中&#xff0c;无论是客户端还是服务端&#xff0c;都有可能成为发送端或接收端&#xff0c;这是因为TCP是一个全双工协议&#xff0c;允许数据在同一连接中双向流动 客户端&#xff08;Client&#xff09;&#xff1a;通常是指主动发起连接请求的一方。例如&#xf…

【归纳总结】常见排序算法及其实现:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快排、归并排序

思维导图&#xff1a; 目录 思维导图&#xff1a; 一、插入排序 1.直接插入排序&#xff1a; a:基本思想&#xff1a; b:基本步骤&#xff1a; c:复杂度分析 d:Java代码实现&#xff1a; 2.希尔排序&#xff08;缩小增量排序&#xff09; a:基本思想&#xff1a; c…

VMware部署linux系统

前期准备 安装VMware的相关教程在我的另一篇博客。 VMware的安装教程-CSDN博客 CentOS7.6的安装包 链接&#xff1a;https://pan.baidu.com/s/1sl8COPAC_VEcRtKxvu2S1A?pwd84el 提取码&#xff1a;84el 如果觉得百度网盘速度太慢&#xff0c;可以去镜像下载也可以 阿里…

对同一文件夹下所有excel表进行相同操作(数据填充、删除、合并)

背景引入&#xff1a;如图所示&#xff0c;笔者需要对数十个表格的银行日记账工作簿合并成一个工作簿&#xff0c;以便与本月银行流水进行核对。 为了方便银行日记账与银行流水进行核对&#xff0c;需要再每个村或小组的表格中&#xff0c;将村或小组的名称放在J列。 clear c…

mongodb在Java中条件分组聚合查询并且分页(时间戳,按日期分组,年月日...)

废话不多说&#xff0c;先看效果图&#xff1a; SQL查询结果示例&#xff1a; 多种查询结果示例&#xff1a; 原SQL&#xff1a; db.getCollection("hbdd_order").aggregate([{// 把时间戳格式化$addFields: {orderDate: {"$dateToString": {"for…

51单片机-独立按键

时间&#xff1a;2024.8.28 作者&#xff1a;Whappy 目的&#xff1a;学习51单片机 代码&#xff1a; #include <REGX52.H> #include "intrins.h"void Delay1ms(unsigned int xms) //11.0592MHz {unsigned char i, j;while(xms--){_nop_();i 2;j 199;do{…

ORA-01186: file 201 failed verification tests

环境&#xff1a;oracle11.2.0.4RACASMred hat6.1x64 主库两节点RAC&#xff0c;备库也为两节点RAC。 备库启用为实时应用查询。日志应用等都是正常的。 主库asm group如下&#xff1a; ASMCMD> ls CRS/DATA/ FRA/ 备库asm group如下&#xff1a; ASMCMD> ls CRS/SDATA/ …

西北工业大学oj-打印杨辉三角

用函数编程计算并输出如图所示的杨辉三角&#xff0c;行数由用户输入。 这道题就很简单了知道杨辉三角的规律&#xff0c;前后都是1&#xff0c;中间数字等于左上加右上 杨辉三角可以通过递推公式计算&#xff1a;C(n, k) C(n-1, k-1) C(n-1, k)&#xff0c;其中 C(n, k) 表…

掌控安全CTF-2024年8月擂台赛-ez_misc

题解&#xff1a; 题目给了一个流量包和一个加密的zip文件&#xff0c;我们首先打开流量包&#xff0c;很多流量&#xff0c;查看一下http协议&#xff0c;发现是个sql靶场&#xff0c;找到关键字样flag&#xff0c;得到一串字符&#xff1a; LJWXQ2C2GN2DAYKHNR5FQMTMPJMDER…

STM32F103C8----GPIO(跟着江科大学STM32)

一&#xff0c;GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口 可配置为8种输入输出模式 引脚电平&#xff1a;0V~3.3V&#xff08;0V&#xff09;&#xff0c;部分引脚可容忍5V 输出模式下可控制端口输出高低电平&#xff0c;用以驱动…

【机器学习-随记】使用 Slack 和 Facebook Messenger 的消息机器人实现虚拟客服人员

使用 Slack 和 Facebook Messenger 的消息机器人实现虚拟客服人员 1. 平台选择与集成 2. 消息机器人开发 3. 自然语言处理 (NLP) 4. 虚拟助手功能实现 5. 语音助手集成 6. 安全与用户隐私 7. 测试与部署 &#x1f388;边走、边悟&#x1f388;迟早会好 实现一个虚拟客…

基于精益六西格玛管理方法进行生产线综合改善

生产线精益六西格玛改善是一个系统工程&#xff0c;只有对其进行系统的策划与组织&#xff0c;才能收到良好的改善效果。一般来说&#xff0c;需要成立一个专门的精益六西格玛推进组织&#xff0c;由其完成一系列的组织、准备工作。具体如下&#xff1a; &#xff08;1&#xf…

王立铭脑科学50讲后续1,自己从课程中提起自己所需的知识,安放到自己的知识体系中。

王立铭脑科学50讲后续1&#xff0c;自己从课程中提起自己所需的知识&#xff0c;安放到自己的知识体系中。 建立第一版——对人类智慧的框架&#xff0c;后期的所有相关知识都安装在这个框架里&#xff0c;不断修正这个框架。 最底层&#xff1a;感知输入系统和动作输出系统&a…

高效过滤器检漏过程中上游浓度过低过高什么原因?

洁净区高效过滤器检漏是确保洁净环境正常运行的重要环节&#xff0c;但是很多企业检测人员&#xff0c;在进行高效过滤器检漏过程中&#xff0c;经常会遇到一些突发问题无法解决&#xff0c;今天中邦兴业技术工程师团队给大家汇总了一些高效过滤器检漏过程中常见问题&#xff0…