异常处理注解 @ExceptionHandler

今天记录下 SpringBoot 中 @ExceptionHandler 的使用。

场景

有一个员工表(employee),且给表中的 username 属性设置了唯一性。

-- auto-generated definition
create table employee
(
    id          bigint auto_increment comment '主键'
        primary key,
    name        varchar(32)   not null comment '姓名',
    username    varchar(32)   not null comment '用户名',
    password    varchar(64)   not null comment '密码',
    phone       varchar(11)   not null comment '手机号',
    sex         varchar(2)    not null comment '性别',
    id_number   varchar(18)   not null comment '身份证号',
    status      int default 1 not null comment '状态 0:禁用,1:启用',
    create_time datetime      null comment '创建时间',
    update_time datetime      null comment '更新时间',
    create_user bigint        null comment '创建人',
    update_user bigint        null comment '修改人',
    constraint idx_username
        unique (username)
)
    comment '员工信息' collate = utf8_bin;


我想通过新增员工功能添加一个员工,但是当添加用户名重复时会报以下错误。
IDEA报错
IDEA报错
API接口报错
swagger报错

处理

可以看到前端并没有返回具体的报错信息,此时我们想要把 用户名重复 的错误返回给前端就可以用到 @ExceptionHandler 注解来实现。
先写一个类并添加 @RestControllerAdvice 注解来捕获异常,编写一个方法并添加 @ExceptionHandler 注解使其能够捕获我们想要捕获的错误类型(方法参数里面使我们想要捕获的错误类型)。
根据上面 IDEA 截图的报错可以看到报错的类型为 “SQLIntegrityConstraintViolationException”,报错信息为 " Duplicate entry ‘zhangsan’ for key ‘employee.idx_username’ ",

package com.sky.handler;

import com.sky.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理器,处理项目中抛出的业务异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

	// 处理重复用户名错误
    @ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
        // 得到报错信息:Duplicate entry 'zhangsan' for key 'employee.idx_username'
        String message = ex.getMessage();

        // 判断是否是重复数据异常
        if (message.contains("Duplicate")) {
            // 得到重复的用户名
            String[] split = message.split(" ");
            String userName = split[2];
            return Result.error("用户名已存在:" + userName);
        }
        // 若不是重复数据异常,则返回默认的错误信息
        else{
            return Result.error("位置错误");
        }
    }
}

结果

此时再添加重复员工信息时就会返回具体信息。
API接口界面
前端接口界面
IDEA界面
可以看到此时IDEA控制台界面就不会在报错了,因为我们已经将这个错误正常处理了。
IDEA界面

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++STL

STL基本概念 standard template library : 标准模板库STL从广义上可以分为: 容器(container) 算法(algorithm) 迭代器(iterator)。 容器和算法之间通过迭代器进行无缝连接。 STL几乎所有的代码都采用了模板类或者模板函数STL六大组件 STL的容器 STL的容器就是将运…

uniapp滑动页面切换和下拉刷新,触底加载更多(swiper + scroll-view)

因为官方文档乱七八糟的,所以自己来总结下 需求: 常见的上方tag标签切换,下方是页面,上面点击切换,下面页面也切换,下方列表有下拉刷新,触底加载更多 因为这两个组件都是固定高度的,…

maven管理使用

maven基本使用 一、简介二、配置文件三、项目结构maven基本标签实践(例子) 四、pom插件配置五、热部署六、maven 外部手动加载jar打包方式Maven上传私服或者本地 一、简介 基于Ant 的构建工具,Ant 有的功能Maven 都有,额外添加了其他功能.本地仓库:计算机中一个文件夹,自己定义…

最全对象存储(云盘)挂载本地主机或服务器

1.对象存储介绍 1.1 分类 分布式存储的应用场景相对于其存储接口,现在流行分为三种: 块存储: 这种接口通常以QEMU Driver或者Kernel Module的方式存在,这种接口需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口,块存储一般…

Adobe Illustrator 2023--AI2023中文

Adobe Illustrator 2023是一款专业的矢量图形设计软件,广泛应用于印刷、Web、视频和移动设备的设计制作。它提供了丰富的绘图工具、矢量图形编辑功能和灵活的排版设计工具,帮助用户快速高效地制作出精美的设计作品。相较于其他设计软件,Adobe…

在Windows服务器上部署项目【虚拟机版】

一. jdk的安装 1、直接双击jdk应用程序,然后下一步下一步即可。 2、安装完成后,在此电脑➡右键➡属性➡高级系统变量。 3、配置环境变量 新建JAVA_HOMEC:\Program Files\Java\jdk1.8.0_144 编辑pathpath%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 4、测试&am…

照片删除了怎么恢复回来

照片,对我们来说,这两个字眼再熟悉不过了,每一张照片都包含无比重要的意义,相信在大家的心目中,这些包含意义的照片都是无价的。怎样找回删除的照片? 既然这些照片对我们来说意义非凡,那如果不小…

【银行测试】银行项目,信贷/贷款业务测试+常问面试(二)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 银行测试-信贷&am…

MySQL基础学习: 使用EXPLAIN查看执行计划详解分析

一、EXPLAIN语句的作用 在客户端执行MySQL的操作语句,会依次经过MySQL客户端连接管理、语法解析与优化(查询缓存、语法解析、查询优化)、存储引擎层。其中查询优化器在基于成本和规则对查询语句进行优化,并且在优化后会生成一个执…

AC修炼计划(AtCoder Beginner Contest 334)A~G

传送门:UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) - AtCoder A题是最最基础的语法题就不再讲解。 B - Christmas Trees 该题虽然分低,但我觉得还是很不错的。 给你 l 和 r ,设满足题意的数字是x则…

深入解析JavaScript中构造函数和new操作符

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ 目录 ✨ 前言 ✨ 正文 第一节:构造函数 第二节:new操作符 第三节:实例与原型 ✨ 结语 ✨ 前言…

ssm基于java的自助医疗服务系统的设计与实现+jsp论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本自助医疗服务系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

C#MQTT编程04--订阅报文

1、报文回顾 在MQTT中,消息传递模式是采用发布订阅模式(Publish-Subscribe Pattern),它将发送消息的客户端(发布者)与接收消息的客户端(订阅者)解耦,使得两者不需要建立…

【python】07.字符串和常用数据结构

字符串和常用数据结构 使用字符串 第二次世界大战促使了现代电子计算机的诞生,最初计算机被应用于导弹弹道的计算,而在计算机诞生后的很多年时间里,计算机处理的信息基本上都是数值型的信息。世界上的第一台电子计算机叫ENIAC(电…

冠军获奖经历:这一路我们不孤单!

Datawhale干货 获奖:元贞、小罗,Datawhale优秀学习者 前 言 大家好,我是 2023 寻找游戏大模王 AI 原生应用大赛的 Top1 荆轲刺秦王团队的小罗,很高兴能在这里与大家分享我们这次比赛的经验,同时也希望以后有机会可以和…

华为常用的命令——display,记得点赞收藏!

华为设备提供了多条display命令用于查看硬件部件、接口及软件的状态信息。通常这些状态信息可以为用户故障处理提供定位思路。 常用的故障信息搜集的命令如下: 路由器常用维护命令表 交换机常用的故障信息搜集 关注 工 仲 好:IT运维大本营,获…

函数栈桢的创建和销毁

函数栈桢的创建和销毁 一、解决的问题二、认识常用的寄存器及其指令操作三、函数栈桢解析三、回答问题 一、解决的问题 1.局部变量是怎么创建的?  2.为什么局部变量的值是随机值?  3.函数是怎么传参的?传参的顺序是怎样的?  4.…

全新小白菜QQ云端机器人登录系统源码 /去除解密授权学习版源码

源码介绍: 全新小白菜QQ云端机器人登录系统源码,是一款经过全面解密的授权学习版源码。 这款源码已解除了授权版的限制,然而许多人可能对其用途并不了解。实际上,该源码主要面向群机器人爱好者设计。它是一个基于挂机宝机器人框…

【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 二分查找算法合集 位运算 LeetCode100160. 价值和小于等于 K 的最大数字 给你一个整数 k 和一个整数 x 。 令 s 为整数 num 的下标从1 开始的二进制表示。我们说一个整数 num 的 价值 是满足 i % x 0 且…

css3背景与渐变

css3背景与渐变 前言背景颜色background-color基础知识背景图片background-image基础知识背景图片的重复模式 背景尺寸background-sizecontain和cover是两个特殊的background-size的值 背景裁切 background-clip背景固定 background-attachment背景图片位置 background-positio…