全局异常处理器

news2025/2/22 12:36:50

文章目录

  • 一、全局异常处理器
    • 1.1 程序
    • 1.2 @ControllerAdvice 注解
  • 二、封装结果集

一、全局异常处理器

  • 各层代码出现异常,我们是如何处理的?

​ 未做处理。

​ 如果是在Mapper层出现异常,会抛给Service,Service会抛给Controller,Controller最终会返回给框架,框架会响应一串JSON数据,里面封装的错误的信息,但是框架封装的JSON数据并不符合我们的开发规范

image-20230517120101960

  • 出现异常,该怎么处理?

​ 方案一:在Controller方法中进行try…catch处理

​ 方案二: 全局异常处理器。 Controller抛出的异常没有处理,最终会抛给全局异常处理器处理,处理完后再给浏览器响应统一处理结果集。

image-20230517121603278

@RestControllerAdvice = @ControllerAdvice + @ResponseBody

所以在全局异常处理器中的返回结果还是JSON数据

1.1 程序

/**
 * 全局异常处理
 * 底层是通过代理,代理controller,通过AOP把我们的一些方法拦截到,如果有异常,就在这个类统一进行处理
 * 下面就是只要带有RestController.class, Controller.class,Service.class的注解的类或方法出现异常,我们都会进行统一处理
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class, Service.class})  // 通知
@ResponseBody  //我们需要返回JSON数据
@Slf4j
public class GlobalExceptionHandler {

//  表示处理SQL异常
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex) {
//      打印日志信息
        log.error(ex.getMessage());//Duplicate entry 'zhangjingqi' for key 'employee.idx_username'

//      在这里也可以判断异常的具体信息,比如:
        if(ex.getMessage().contains("Duplicate entry")){
            String[] s = ex.getMessage().split(" ");
            String username = s[2];
            String msg =s[2]+"已经存在";
           return   R.error(msg);
        }
//      其他情况下可以直接输出
        return R.error("未知错误:"+ex.getMessage());
    }
}
/**
 *  全局异常处理器
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
//  指定捕获哪一个类型的异常
    @ExceptionHandler(Exception.class)  //捕获所有异常
    public Result ex(Exception ex){
         ex.printStackTrace();// 打印堆栈信息
        return Result.error("对不起,操作失败");
    }
    
}

1.2 @ControllerAdvice 注解

称为Controller增强器,给Controller控制器添加统一的操作或处理。

我是在下面的这篇文章中学习的

SpringMVC 中 @ControllerAdvice 注解的三种使用场景! - 江南一点雨 - 博客园 (cnblogs.com)

二、封装结果集

对于code编码自己可以随便定义,下面只是一个例子

/**
 * 通用返回结果类,服务端响应的数据都会封装成此对象
 * @param <T>  这个类会接受多种类型,可能是普通对象,可能是数组、集合等等等等,所以我们要将这个加个泛型<T>,表示可以接收任何参数
 */
//  为什么不用Object,而用<T>?  如果用object需要强转类型 而T不用
@Data
public class R<T> {

    private Integer code; //编码:1成功,0和其它数字为失败

    private String msg; //错误信息

    private T data; //数据

    private Map map = new HashMap(); //动态数据

//  方法的返回值及参数中的T属于泛型
    public static <T> R<T> success(T object) {
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;   //成功
        return r;
    }

    public static <T> R<T> error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;   //失败
        return r;
    }

    public R<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+SpringBoot制作一个论坛小程序

制作一个论坛互动平台,让兴趣志同道合者用户聚集在这里交流话题、展示自我、结交朋友。 一、小程序1.1 项目创建1.2 首页1.3 论坛板块页1.4 个人中心页1.5 帖子详情页二、API2.1 SpringBoot框架搭建

基于html+css的图展示74

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

进程线程基本知识

1 进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后就会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xff0c;它会被装载到内存中&#xff0c;接着 CPU 会执行程序中的每一条指令&#xff0c;那么这个运行中的程序&#xff0c;就被…

springboot+java网上求职人才招聘网站 s0rp8

本人才招聘网站采用Java技术&#xff0c;Mysql数据库开发&#xff0c;充分保证了系统稳定性、完整性。 人才招聘网站的设计与实现的设计思想如下&#xff1a; Spring Boot 是 Spring 家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。也可以说 …

期刊介绍|中科院一区8+期刊,影响因子飞涨,国人友好,明显扩刊趋势!

今天给大家介绍一本期刊&#xff1a;Hepatobiliary Surgery and Nutrition&#xff1b; 一、基本信息: 1、期刊名称&#xff1a;Hepatobiliary Surgery and Nutrition&#xff1b; 2、期刊ISSN&#xff1a;1054-139X&#xff1b; 3、出版商&#xff1a;Elsevier USA&#xff1b…

第四章 字符串

目录 一、反转字符串二、反转字符串 II三、替换空格四、反转字符串中的单词五、左旋转字符串六、找出字符串中第一个匹配项的下标&#xff08;KMP算法实现&#xff09;七、重复的子字符串 一、反转字符串 Leetcode 344 class Solution { public:void reverseString(vector<…

python连接kafka加载数据

背景&#xff1a;读取TXT文件&#xff0c;加载到kafka中&#xff0c;然后通过logstash消费kafka中的数据加载到es中 第一步&#xff1a;导入相应的依赖包 pip install kafka-python pip install loguru pip install msgpack第二步&#xff1a;编写连接kafka的代码 # -*- …

打印机出现错误0x00000709的原因及解决方法

一般来说&#xff0c;出现错误0x00000709&#xff0c;可能是用户试图设置默认打印机时&#xff0c;系统无法完成操作的错误。这种错误通常发生在Windows 10或Windows 7操作系统上。**驱动人生**分析&#xff0c;其原因可能是以下几种情况&#xff1a; 1、已经设置了另一个打印…

解决VMware虚拟机Centos7切换网络更换IP问题

解决VMware虚拟机Centos7切换网络更换IP问题 问题描述Centos7设置固定静态IP 问题描述 学习docker&#xff0c;在VMware虚拟机Centos7系统中使用docker部署了mysql&#xff0c;redis&#xff0c;nacos&#xff0c;虚拟机DHCP分配的ip为192.168.171.128&#xff0c;使用连接工具…

ThinkSystem DM 全闪存阵列 —— 通过全闪存 NVMe 转型加速您的业务

ThinkSystem DM 全闪存阵列——通过全闪存 NVMe 转型加速您的业务 挑战 要缩短产品上市时间并提高客户满意度&#xff0c;企业必须不断改善关键业务运营的速度和响应能力。其中的一个关键要素是全闪存存储&#xff0c;它可以大幅加速关键工作负载。 不过&#xff0c;随着全闪…

电风扇UL507认证指南!!!

UL 507 电风扇UL安全标准 L507标准适用于非工业用风机和鼓风机两大类。一是用于空气循环的风扇&#xff0c;如台扇和吊扇&#xff1b;二是用于通风的风扇&#xff0c;例如阁楼、墙壁、窗户和家用抽油烟机的风扇。此类别的风扇按照 NEC 安装。 测试类似于 UL 705&#xff0c;具…

GitLabCI/CD 构建数据采集与监控

点击上方蓝字⭐️关注“DevOps云学堂”&#xff0c;接收最新技术实践 今天是「DevOps云学堂」与你共同进步的第 25 天 如果这篇文章对您有帮助&#xff0c;欢迎转发点赞分享。您的关注是我持续分享的动力&#xff01; 使用Prometheus对GitLab Runner监控 1.1 配置GitLab Runner…

NGINX 和 HAProxy:基于公有云标准环境的用户体验测试对比

原文作者&#xff1a;Amir Rawdat of F5 原文链接&#xff1a;NGINX 和 HAProxy&#xff1a;基于公有云标准环境的用户体验测试对比 转载来源&#xff1a;NGINX 官方网站 业内许多性能基准测试&#xff0c;都是基于峰值吞吐量或每秒请求数 (RPS)&#xff0c;但这些指标可能会过…

code of ridesharing

chengdu.node: num 经纬度 edge&#xff1a; num 两个节点之间的weight order&#xff1a; 编码了一下 label&#xff1a; 任意两点最短路长度 taxi.txt 司机个数 、capacity 、、变换的系数 司机所在位置、capacity order.txt num 订单提交到系统时间、起点node的id、…

过滤器与拦截器 - 登录校验与登录认证

文章目录 登录校验与登录认证一、登录认证1.1 基础登录功能1.2 会话技术1.2.1 介绍1.2.2 方案一 Cookie1.2.2.1 基本介绍1.2.2.2 服务端向浏览器响应Cookie1.2.2.3 浏览器向服务端请求携带Cookie 1.2.3 方案二 Session1.2.3.1 基本介绍1.2.3.2 服务端向浏览器响应Session1.2.3.…

如何把pdf拆分成一页一页?三个方法试试看

PDF文件作为常用的文件&#xff0c;其功能性较为全面。在日常工作过程中&#xff0c;PDF文件格式便于传输&#xff0c;且pdf文件不易被修改&#xff0c;能够增强文件的安全性和有效性。而在很多时候&#xff0c;为了能够快速地将PDF进行传输、保存等&#xff0c;需要对一些pdf文…

3D模型处理实战【Open3D】

在本文中&#xff0c;我们将学习如何使用 Python 的 Open3D 库探索、处理和可视化 3D 模型。 如果你正在考虑为特定任务处理 3D 数据/模型&#xff0c;例如为 3D 模型分类和/或分割训练 AI 模型&#xff0c;可能会发现本演练很有帮助。 在 Internet 上找到的 3D 模型&#xff…

Netty核心组件模块(二)

1.EventLoop组件 1.1.ChannelHandlerContext 1>.保存Channel相关的所有上下文信息,同时关联一个ChannelHandler对象; ChannelHandlerContext底层真实的类型为:DefaultChannelHandlerContext! 2>.即ChannelHandlerContext中包含一个具体的事件处理器ChannelHandler,同时…

GEE遥感云大数据林业应用典型案例实践及GPT模型应用

目录 一 平台及基础开发平台 二 GEE基础知识与ChatGPT等AI模型交互 三 重要知识点微型案例串讲与GPT模型交互演示 四 典型案例综合演练 更多推荐 聚焦目前遥感应用最热门领域之一的林业&#xff0c;重点结合典型应用案例综合展示GEE云平台的使用技巧和强大功能&#xff0c…

Spring Aop以及SpringBoot统一功能的处理

一.SpringAop 1.SpringAop是一种思想&#xff0c;指的是对使用比较多的功能进行统一处理&#xff0c;比如我们在写博客系统项目&#xff0c;当我们在登录博客列表页和博客详情页以及博客编辑页的时候的时候&#xff0c;都需要写代码进行登录验证&#xff0c;这时候代码就比较繁…