【学习】若依源码(前后端分离版)之 “ 异常处理”
大型纪录片:学习若依源码(前后端分离版)之 “ 异常处理”
- 前言
- 1、统一返回实体定义
- 2、定义登录异常定义
- 3、基于@ControllerAdvice注解的Controller层的全局异常统一处理
- 4、测试访问请求
- 结语
前言
通常一个web框架中,有大量需要处理的异常。比如业务异常,权限不足等等。前端通过弹出提示信息的方式告诉用户出了什么错误。
通常情况下我们用try…catch…对异常进行捕捉处理,但是在实际项目中对业务模块进行异常捕捉,会造成代码重复和繁杂, 我们希望代码中只有业务相关的操作,所有的异常我们单独设立一个类来处理它。
全局异常就是对框架所有异常进行统一管理。若依前后端分离版本的异常处理是通过使用Spring的@RestControllerAdvice注解来实现的。这个注解可以将一个类标记为全局异常处理器,用来捕获和处理所有的控制器层抛出的异常。
它中定义了一个 GlobalExceptionHandler 类,用来处理各种类型的异常,比如权限校验异常、请求方式不支持异常、业务异常、运行时异常、系统异常、自定义验证异常和演示模式异常。每种异常都有一个对应的@ExceptionHandler注解的方法,用来返回一个AjaxResult对象,包含了错误码和错误信息。这样,前端就可以根据返回的结果来显示相应的提示或者处理逻辑。
所谓全局异常处理器就是使用@ControllerAdvice注解。示例如下:
1、统一返回实体定义
package com.ruoyi.common.core.domain;import java.util.HashMap;/*** 操作消息提醒* * @author ruoyi*/
public class AjaxResult extends HashMap<String, Object>
{private static final long serialVersionUID = 1L;/*** 返回错误消息* * @param code 错误码* @param msg 内容* @return 错误消息*/public static AjaxResult error(String msg){AjaxResult json = new AjaxResult();json.put("msg", msg);json.put("code", 500);return json;}/*** 返回成功消息* * @param msg 内容* @return 成功消息*/public static AjaxResult success(String msg){AjaxResult json = new AjaxResult();json.put("msg", msg);json.put("code", 0);return json;}
}
2、定义登录异常定义
package com.ruoyi.common.exception;/*** 登录异常* * @author ruoyi*/
public class LoginException extends RuntimeException
{private static final long serialVersionUID = 1L;protected final String message;public LoginException(String message){this.message = message;}@Overridepublic String getMessage(){return message;}
}
3、基于@ControllerAdvice注解的Controller层的全局异常统一处理
package com.ruoyi.framework.web.exception;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.LoginException;/*** 全局异常处理器* * @author ruoyi*/
@RestControllerAdvice
public class GlobalExceptionHandler
{private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 登录异常*/@ExceptionHandler(LoginException.class)public AjaxResult loginException(LoginException e){log.error(e.getMessage(), e);return AjaxResult.error(e.getMessage());}
}
@RestControllerAdvice 注解是一个组合注解,由@ControllerAdvice和@ResponseBody组成,而@ControllerAdvice继承了@Component,因此@RestControllerAdvice本质上是个Component,适用于所有使用@RequestMapping方法。
@ExceptionHandler 注解是用来指定异常处理方法的,当控制器中抛出指定类型的异常时,Spring MVC会自动调用使用@ExceptionHandler标记的方法来处理异常。每种异常都有一个对应的@ExceptionHandler注解的方法,是通过在@ExceptionHandler注解中添加参数来实现的,参数是某个异常类的class,代表这个方法专门处理该类异常。
这样,当控制器中抛出不同类型的异常时,就会调用相应的@ExceptionHandler注解的方法来处理。如果有多个方法处理同一类型的异常,那么会抛出Ambiguous @ExceptionHandler异常。
如果有多个类使用@RestControllerAdvice注解,那么可以通过指定order属性来控制异常处理类的优先级,order值越小,优先级越高。
4、测试访问请求
@Controller
public class SysIndexController
{/*** 首页方法*/@GetMapping("/index")public String index(ModelMap mmap){/*** 模拟用户未登录,抛出业务逻辑异常*/SysUser user = ShiroUtils.getSysUser();if (StringUtils.isNull(user)){throw new LoginException("用户未登录,无法访问请求。");}mmap.put("user", user);return "index";}
}
根据上面代码含义,当我们未登录访问/index时就会发生LoginException业务逻辑异常,按照我们之前的全局异常配置以及统一返回实体实例化,访问后会出现AjaxResult格式JSON数据, 下面我们运行项目访问查看效果。
界面输出内容如下所示:
{"msg": "用户未登录,无法访问请求。","code": 500
}
对于一些特殊情况,如接口需要返回json,页面请求返回html可以使用如下方法:
@ExceptionHandler(LoginException.class)
public Object loginException(HttpServletRequest request, LoginException e)
{log.error(e.getMessage(), e);if (ServletUtils.isAjaxRequest(request)){return AjaxResult.error(e.getMessage());}else{return new ModelAndView("/error/500");}
}
若依系统的全局异常处理器为GlobalExceptionHandler类
注意:如果全部异常处理返回json,那么可以使用@RestControllerAdvice代替@ControllerAdvice,这样在方法上就可以不需要添加@ResponseBody。
结语
所以一定要养成看文档的好习惯啊。那么以上就是唐某的一些理解。这次的分享就到这里了。记得一键三连~( •̀ ω •́ )✧
相关文章:
【学习】若依源码(前后端分离版)之 “ 异常处理”
大型纪录片:学习若依源码(前后端分离版)之 “ 异常处理” 前言1、统一返回实体定义2、定义登录异常定义3、基于ControllerAdvice注解的Controller层的全局异常统一处理4、测试访问请求结语 前言 通常一个web框架中,有大量需要处理…...
天花板级,Python接口自动化测试-接口关联封装调用(实例)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 流程相关的接口&a…...
yolov5代码解读之yolo.py【网络结构】
这个文件阿对于做模型修改、模型创新有很好大好处。 首先加载一些python库和模块: 如果要执行这段代码,直接在终端输入python yolo.py. yolov5的模型定义和网络搭建都用到了model这个类(也就是以下图片展示的东西):(以前代码没…...
Docker之jenkins部署harbor在harbor中完成部署
Docker之jenkins部署harbor在harbor中完成部署 1、harbor作用 Harbor允许用户用命令行工具对容器镜像及其他Artifact进行推送和拉取,并提供了图形管理界面帮助用户查阅和删除这些Artifact。在Harbor 2.0版本中,除容器镜像外,Harbor对符合OCI…...
安装Jenkins
一、什么是Jenkins Jenkins是一个开源软件项目,是基于Java开发的。我们可以利用Jenkins来实现持续集成的功能。 因为Jenkins是基于Java开发的,所以在安装Jenkins之前首先需要安装Java的JDK。 二、安装Jenkins 在Windows平台上面安装Jenkins共有两种方式…...
大运空瓶行动,绘就生态文明画卷
随着成都第31届世界大学生夏季运动会赛事的成功举办,为了倡导节约水资源、绿色大运,在此之前成都电视2台《城视民生》栏目面向全市发起“大运空瓶行动”的倡议,呼吁市民杜绝水资源浪费,喝完瓶中水,并鼓励市民积极参与到…...
tomcat7.exe 启动闪退解决
标题tomcat7.exe 启动闪退解决 双击tomcat7.exe启动,但是出现闪退问题,无法启动tomcat 解决: 1.解决 tomcat7.exe 启动闪退解决 第一步:双击打开tomcat7w.exe 文件 如果出现 “指定的服务未安装。 Unable to open the service ‘…...
java修改jar包中的配置文件
方法一 !!!除了以上的方式,其实也可以通过 vim 命令直接修改 jar 包配置文件的内容,然后直接保存即可,不过这种方法必须保证服务器上已经安装了 zip 和 unzip 命令。 方法二 首先需要找出你的配置文件在…...
半导体器件||的学习
电子管的介绍: 到底什么是电子管(真空管)? - 知乎 芯片破壁者(一):从电子管到晶体管“奇迹”寻踪 - 知乎 晶体管: 什么是晶体管?它有什么作用? - 知乎 改…...
jenkins流水线
1.拉取代码 https://gitee.com/Wjc_project/yygh-parent.git2、项目编译 mvn clean package -Dmaven.test.skiptrue ls hospital-manage/target3、构建镜像 ls hospital-manage/target docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-ma…...
视频监控汇聚EasyCVR平台WebRTC流地址无法播放的原因排查
开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多…...
NOSQL——redis的安装,配置与简单操作
目录 一、缓存的相关知识 1)缓存的概念 2)系统缓存 buffer与cache: 3)缓存保存位置及分层结构 DNS缓存 应用层缓存 数据层缓存 分布式缓存服务: 数据库: 硬件缓存 二、关系型数据与非关系型数据…...
《合成孔径雷达成像算法与实现》Figure3.7
代码复现如下: clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间%参数计算 B TBP/T; …...
Linux 目录结构
初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件。如操作系统内核、引导程序Grub等。home --- 存储普通用户的个人文件 ftp --- 用户所有服务httpdsambauser1user2bin --- 系统启动时需要的执行文件(二进制&#x…...
7天获英国名校邀请函|CSC青骨获批成功案例补记
Q老师要求2周内拿到邀请函且必须是世界排名前200名的高校。我们在第7天就获得了世界百强名校-英国兰卡斯特大学的邀请函,导师的研究方向完全契合,提前实现了Q老师的委托目标,使其顺利获批CSC青骨项目。特别提示:青骨项目国内派出院…...
ffmpeg ts列表合并为mp4
操作系统:ubuntu 注意事项: 1.ts文件顺序必须正确,也就是下一帧的dst和pst要比上一帧的大,否则会报错 2.codecpar->codec_tag要设置为0,否则报错Tag [27][0][0][0] incompatible with output codec id ‘27’ (avc1…...
MATLAB程序初始化OpenFOAM颗粒位置
问题引入 在OpenFOAM的颗粒两相流求解器中,我们可以采用manualInjection的方式进行自定义颗粒的初始位置,这个命令十分方便,在CFDEM中也有类似的命令,不过CFDEM中的命令更加强大,我们不仅可以定义颗粒的初始位置&…...
软件第三方CMA、CNAS测试的目的和意义,信息化建设验收测试依据是什么?
在当今互联网时代,软件的第三方CMA、CNAS测试成为了软件行业的重要环节。那么,这个测试的目的和意义是什么呢?另外,信息化建设验收测试依据又是什么呢? 一、软件测试第三方CMA、CNAS测试的目的和意义 1、研究进展 随着软件行业的迅…...
CNN成长路:从AlexNet到EfficientNet(02)
一、说明 在~10年的深度学习中,进步是多么迅速!早在 2012 年,Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在,我们超过90%的EfficientNet架构和师生训练(teacher-student)。 二、第一阶段 …...
【Kubernetes】yaml文件格式
目录 YAML 语法格式: 查看 api 资源版本标签 写一个yaml文件demo 创建资源对象 查看创建的pod资源 创建service服务对外提供访问并测试 创建资源对象 查看创建的service 在浏览器输入 nodeIP:nodePort 即可访问 kubectl run --dry-runclient 打印相应的 A…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
