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

校园课程助手【3】-使用枚举类封装异常优雅处理全局异常

接着2中登录模块补充一个点:

//可以看到这里返回给前端控制器的是一个类而不是html页面public RespBean doLogin(@Valid LoginVo loginVo, HttpServletRequest request,HttpServletResponse response){return userService.doLogin(loginVo, request, response);}

首先:在本项目中,所有的Controller类返回给前端控制器的都是ResBean对象,下面是这个类的实现,属性包括返回代码,提示信息以及一个Object类。

package com.example.seckilldemo.vo;
import lombok.Data;/*** @Author wuyifan* @Date 2024/4/22 16:17* @Version 1.0*/
@Datapublic class RespBean {private long code;private String message;private Object object;public static RespBean success() {return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), null);}public static RespBean success(Object object) {return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), object);}public static RespBean error(RespBeanEnum respBeanEnum) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), null);}public static RespBean error(RespBeanEnum respBeanEnum, Object object) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), object);}public RespBean(long code, String message, Object object) {this.code = code;this.message = message;this.object = object;}public RespBean(){}public long getCode() {return code;}public void setCode(long code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getObject() {return object;}public void setObject(Object object) {this.object = object;}
}

其中返回代码和信息是自定义一个枚举类实现的,用于优雅的处理全局异常信息,其类代码如下:

package com.example.seckilldemo.vo;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;/*** @Author wuyifan* @Date 2024/4/22 16:17* @Version 1.0*/
@ToString
@Getter
@AllArgsConstructor
public enum RespBeanEnum {//通用SUCCESS(200, "SUCCESS"),ERROR(500, "服务端异常"),//登录模块LOGIN_ERROR(500210, "用户名或者密码不正确"),MOBILE_ERROR(500211, "手机号码格式不正确"),BIND_ERROR(500212, "参数校验异常"),MOBILE_NOT_EXIST(500213, "手机号码不存在"),PASSWORD_UPDATE_FAIL(500214, "更新密码失败"),SESSION_ERROR(500215, "用户SESSION不存在"),//秒杀模块EMPTY_STOCK(500500, "库存不足"),REPEATE_ERROR(500501, "该商品每人限购一件"),REQUEST_ILLEGAL(500502, "请求非法,请重新尝试"),ERROR_CAPTCHA(500503, "验证码错误,请重新输入"),ACCESS_LIMIT_REACHED(500504, "访问过于频繁,请稍后重试"),//订单模块5003xxORDER_NOT_EXIST(500300, "订单不存在"),;private final Integer code;private final String message;public Integer getCode() {return code;}public String getMessage() {return message;}
}

最后:介绍本项目使用上述枚举类封装一个优雅的 Spring Boot 全局异常处理的过程。
即使用 @ControllerAdvice 和 @ExceptionHandler 处理全局异常:

  1. 新建异常信息实体类(即RespBean )
  2. 自定义异常类型。
    一般我们处理的都是 RuntimeException ,所以如果你需要自定义异常类型的话直接集成这个类就可以了。
package com.example.seckilldemo.exception;import com.example.seckilldemo.vo.RespBean;
import com.example.seckilldemo.vo.RespBeanEnum;/*** 全局异常** @author: wuyifan* @date 2024/5/2 5:32 下午* @ClassName: GlobalException*/
public class GlobalException extends RuntimeException {private RespBeanEnum respBeanEnum;public RespBeanEnum getRespBeanEnum() {return respBeanEnum;}public void setRespBeanEnum(RespBeanEnum respBeanEnum) {this.respBeanEnum = respBeanEnum;}public GlobalException(RespBeanEnum respBeanEnum) {this.respBeanEnum = respBeanEnum;}
}
  1. 新建异常处理类
    我们只需要在类上加上@ControllerAdvice注解这个类就成为了全局异常处理类,当然你也可以通过 assignableTypes指定特定的 Controller 类,让异常处理类只处理特定类抛出的异常。
package com.example.seckilldemo.exception;import com.example.seckilldemo.vo.RespBean;
import com.example.seckilldemo.vo.RespBeanEnum;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** 全局异常处理类** @author: wuyifan* @date 2024/5/2 5:33 下午* @ClassName: GlobalExceptionHandler*/
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public RespBean ExceptionHandler(Exception e) {if (e instanceof GlobalException) {GlobalException exception = (GlobalException) e;return RespBean.error(exception.getRespBeanEnum());} else if (e instanceof BindException) {BindException bindException = (BindException) e;RespBean respBean = RespBean.error(RespBeanEnum.BIND_ERROR);respBean.setMessage("参数校验异常:" + bindException.getBindingResult().getAllErrors().get(0).getDefaultMessage());return respBean;}
//        System.out.println("异常信息" + e);return RespBean.error(RespBeanEnum.ERROR);}
}

这样使用枚举类优雅的封装异常信息,通过自定义异常类型,最后交给全局异常类处理就可以啦啦啦啦啦!

相关文章:

校园课程助手【3】-使用枚举类封装异常优雅处理全局异常

接着2中登录模块补充一个点: //可以看到这里返回给前端控制器的是一个类而不是html页面public RespBean doLogin(Valid LoginVo loginVo, HttpServletRequest request,HttpServletResponse response){return userService.doLogin(loginVo, request, response);}首先…...

LeetCode面试150——58最后一个单词的长度

题目难度:简单 默认优化目标:最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及代码实现 3.1 反向遍历 参考文献 1 题目描述 给你一个字符串 s,由若干单词组成,单词前后用一些空格字…...

MySQL——数据库的操作,数据类型,表的操作

MySQL——数据库的操作,数据类型,表的操作 1. 数据库的操作1.1 显示当前数据库1.2 创建数据库舍弃当前所写的SQL语句查看当前数据库服务全局的默认字符集 1.3 使用数据库1.4 查看当前操作的数据库查看MySQL的帮助 1.5 删除数据库 2. 常见数据类型2.1 数值…...

Go 临界资源 安全问题

临界资源安全的问题: 临界资源: 指并发环境中多个 进程/线程/协程 可以共享(都可以调用)的资源/变量,如果在并发环境中处理不当,就会造成一些 严重、问题 func main() {//临界资源a : 10go func() {a 100f…...

安卓常用控件(上)

文章目录 TextViewButtonEditText TextView textview主要用于在界面上显示一段文本信息。 属性名描述id给当前控件定义一个唯一的标识符。layout_width给控件指定一个宽度。match_parent:控件大小与父布局一样;wrap_content:控件大小刚好够包…...

基于 RabbitMQ 实现延迟消息的订单处理流程

文章目录 订单创建流程1. 商品查询与订单数据初始化2. 总价计算与订单保存3. 扣减库存与购物车清理4. 延迟消息与支付状态检测 订单延迟消息监听器支付成功与订单取消1. 订单支付成功2. 订单取消与库存恢复 总结 在现代电商系统中,订单处理是一个复杂且关键的环节。…...

使用Python将Word文档转换为PNG图片

在这篇博客中,我将介绍一个使用Python编写的小工具,它能够将指定文件夹中的所有Word文档(.doc和.docx格式)转换为PNG图片。这个工具基于wxPython库构建图形用户界面,并结合了win32com和PyMuPDF库实现文档格式的转换。接…...

Qt创建Json对象时浮点数的精度控制

我们在Qt中使用Json都是使用QJsonDocument、QJsonArray、QJsonObject、QJsonValue等类。 当我们在QJsonObject中插入浮点数字段时&#xff0c;会发现浮点数的小数位数很长&#xff0c;如下所示&#xff1a; #include <QJsonDocument> #include <QJsonArray> #incl…...

【海贼王航海日志:前端技术探索】CSS你了解多少?(二)

目录 1 -> 字体属性 1.1 -> 设置字体 1.2 -> 字体大小 1.3 -> 字体粗细 1.4 -> 文字样式 2 -> 文本属性 2.1 -> 文本颜色 2.1.1 -> 认识RGB 2.1.2 -> 设置文本颜色 2.2 -> 文本对齐 2.3 -> 文本装饰 2.4 -> 文本缩进 2.5 -&g…...

软件测试面试200问(全)

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前 3 年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&a…...

【单片机毕业设计选题24106】-基于阿里云的心率呼吸监测系统

系统功能: 上电后OLED显示 “欢迎使用请稍后”&#xff0c;两秒后显示Connecting...表示 正在连接阿里云&#xff0c;正常连接阿里云后进入系统显示界面&#xff0c;如长时间显示Connecting...请 检查WiFi网络是否正确。 系统连接阿里云后可在阿里云界面查看到系统上报的温…...

leetcode28:找出字符串第一个匹配的下标

找出字符串第一个匹配的下标 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 public int strStr(Str…...

Java二十三种设计模式-桥接模式(10/23)

桥接模式&#xff1a;解耦抽象与实现的灵活设计 引言 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将抽象部分与其实现部分分离&#xff0c;使它们可以独立地变化。它是一种对象结构型模式&#xff0c;又称为柄体(Handle and Body)模…...

Java 面试指南

Java 面试指南 目录 引言Java 基础知识 数据类型运算符控制结构面向对象编程 Java 高级特性 异常处理集合框架泛型多线程与并发 Java 标准类库 java.lang 包java.util 包java.io 包 Java Web 开发 ServletJSPSpring 框架 数据库连接与JDBC JDBC 基础数据库连接池 设计模式 单…...

计算机毕业设计选题推荐-自习室座位预约系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

android13 删除兼容性警告窗口 deprecation warning 去除弃用警告

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况 3.问题分析 4.代码更改 5.编译测试 6.彩蛋 1.前言 在 Android 13 中,为了提高用户体验和应用的兼容性,系统引入了一些新的隐私和安全特性。这些特性可能会影响旧版应用的行为,因此当用户运行可能不完全兼容 An…...

JESD204B/C协议学习笔记

JESD204B基础概念 204B包含传输层&#xff0c;链路层&#xff0c;物理层。 应用层是对 JESD204B 进行配置的接口&#xff0c;在标准协议中是不含此层&#xff0c;只是为了便于理解&#xff0c;添加的一个层。 协议层指工程中生成的IP核JESD204B&#xff0c;负责处理输入的用户…...

网络安全-渗透测试工具及插件介绍和使用方法

1、Burp Suite Burp Suite 是用于攻击web 应用程序的集成平台。 是一款广泛使用的网络安全工具套件&#xff0c;主要用于测试Web应用程序的安全性。它可以帮助安全研究人员、渗透测试人员和开发人员发现和利用Web应用程序中的安全漏洞。 &#xff08;1&#xff09;下载和安装&a…...

JAVA WEB初步实验

Spring应用开发环境准备 安装配置Spring应用开发环境 熟悉IntelliJ IDEA开发工具 打开idea工具&#xff0c;创建普通Java工程 配置普通Java工程运行环境 得到基本的Java运行环境配置正常 修改pom.xml文件&#xff0c;搭建Spring IOC运行环境 更新pom文件 新建User、TestSpr…...

30 个 JavaScript 技巧,让你的代码更具可读性

1 、使用 !! 转换为布尔值 使用双重否定快速将任何值转换为布尔值。 let truthyValue !!1; // true let falsyValue !!0; // false 2 、 默认函数参数 设置函数参数的默认值以避免定义错误。 function greet(name "Guest") {return Hello, ${name}!; }greet(…...

.Acwing基础课第题-简单-区间和纲

在AI辅助开发的语境下&#xff0c;Skill就是一个包含了领域知识、最佳实践、代码模板的知识包。 以"DAO层CRUD生成"为例&#xff0c;一个Skill包含&#xff1a; /mnt/skills/dao-crud/ ├── SKILL.md # 使用说明 │ ├── 何时使用这个Skill │ …...

Linux下PyTorch3D环境搭建:从依赖解析到编译避坑实战

1. 环境准备&#xff1a;从零开始的依赖解析 在Linux系统上搭建PyTorch3D环境就像组装一台精密仪器&#xff0c;每个零件都必须严丝合缝。我最近在复现一篇3D视觉论文时&#xff0c;就经历了从CUDA版本匹配到gcc降级的完整过程。先说结论&#xff1a;版本对齐是成功的关键&…...

【Agent面试题大揭秘】50道高频题深度解析,助你拿下Offer!

一、Agent 基础与架构什么是 Agent 的“感知-规划-行动”闭环&#xff1f;如何实现&#xff1f;Agent 的长期记忆和短期记忆分别如何设计和存储&#xff1f;如何解决 Agent 的“幻觉”问题&#xff1f;Agent 的状态管理是如何实现的&#xff1f;如何保证多轮对话的状态一致性&a…...

简易数据采集与分析系统

我用 Trae&#xff08;SOLO Coder&#xff09; 自主开发了这款专为硬件工程师打造的数据分析工具&#xff0c;无需懂代码&#xff0c;点点鼠标即可完成采集卡数据全流程分析。核心功能一键导入采集卡原始 ADC 数据&#xff0c;自动适配 12/16 位分辨率&#xff0c;精准转换为真…...

合宙ESP32-C3用PlatformIO调试,别再为USB CDC和DIO配置头疼了

合宙ESP32-C3 PlatformIO调试实战&#xff1a;USB CDC与DIO配置全解析 第一次接触合宙ESP32-C3的开发板时&#xff0c;我被它简洁的设计和亲民的价格所吸引。但当我兴冲冲地打开PlatformIO准备大展拳脚时&#xff0c;却接连遇到了串口无法识别、程序下载失败等一系列问题。经过…...

钻床夹具(说明书+装配图)

钻床夹具是机械加工中提升钻孔精度与效率的关键工具。其核心作用在于通过精准定位与可靠夹紧&#xff0c;确保工件在钻孔过程中保持稳定&#xff0c;避免因振动或位移导致的孔位偏差。传统钻孔作业依赖人工反复校准&#xff0c;不仅效率低下&#xff0c;且难以保证批量加工的一…...

DOL-CHS-MODS整合包:2024一站式解决方案,3大优势助你轻松体验Degrees of Lewdity

DOL-CHS-MODS整合包&#xff1a;2024一站式解决方案&#xff0c;3大优势助你轻松体验Degrees of Lewdity 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS DOL-CHS-MODS整合包作为Degrees of Lewdity游…...

基于STM32LXXX的数字电位器(MAX5402EUA+T)驱动应用程序设计

一、简介: MAX5402EUA+T 是Maxim Integrated(现Analog Devices)推出的一款256抽头、低漂移数字电位器,采用MAX-8封装。 二、主要技术特性: 参数 值 抽头数 256个 端到端电阻 10kΩ 每级步进电阻 39.2Ω (10kΩ/255) 接口类型 SPI兼容,3线串行 电源电压 2.7V ~ 5.5V 温度…...

用K230开发板给AI模型拍训练集照片?一个物理按键搞定(附Python源码)

用K230开发板打造智能训练集采集器&#xff1a;从硬件连接到Python实战 在AI模型训练过程中&#xff0c;高质量的数据集往往比算法本身更重要。但对于初学者和小型项目来说&#xff0c;专业的数据采集设备成本高昂&#xff0c;而普通摄像头又缺乏灵活性和可编程控制。K230开发板…...

AI时代的算法思维:大经典排序学习矩

引言 在现代软件开发中&#xff0c;性能始终是衡量应用质量的重要指标之一。无论是企业级应用、云服务还是桌面程序&#xff0c;性能优化都能显著提升用户体验、降低基础设施成本并增强系统的可扩展性。对于使用 C# 开发的应用程序而言&#xff0c;性能优化涉及多个层面&#x…...