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

SpringBoot项目异常处理

一、异常问题描述

进行添加员工测试的时候,服务端报错, 报错信息如下:

java.sql.SQLIntegrityConstraintViolationException:

主要就是因为在 employee 表结构中,我们针对于username字段,建立了唯一索引,添加重复的username数据时,违背该约束,就会报错。但是此时前端提示的信息并不具体,用户并不知道是因为什么原因造成的该异常,我们需要给用户提示详细的错误信息 。

二、解决方法

要想解决上述测试中存在的问题,我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:

方法一: 在Controller方法中加入 try…catch 进行异常捕获

形式如下:

try{employeeService.save(employee);}catch (Exception e){e.printStackTrace();return R.error("新增员工失败");
}

如果采用这种方式,虽然可以解决,但是存在弊端,需要我们在保存其他业务数据时,也需要在Controller方法中加上try…catch进行处理,代码冗余,不通用。

方法二: 使用异常处理器进行全局异常捕获

采用这种方式来实现,我们只需要在项目中定义一个通用的全局异常处理器,就可以解决本项目的所有异常。

在项目中自定义一个全局异常处理器,在异常处理器上加上注解 @ControllerAdvice,可以通过属性annotations指定拦截哪一类的Controller方法。 并在异常处理器的方法上加上注解 @ExceptionHandler 来指定拦截的是那一类型的异常。

异常处理方法逻辑:

  • 指定捕获的异常类型为 SQLIntegrityConstraintViolationException
  • 解析异常的提示信息, 获取出是那个值违背了唯一约束
  • 组装错误信息并返回
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.sql.SQLIntegrityConstraintViolationException;/*** 全局异常处理*/
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class  GlobalExceptionHandler {/*** 异常处理方法* @return*/@ExceptionHandler(SQLIntegrityConstraintViolationException.class)public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){log.error(ex.getMessage());if(ex.getMessage().contains("Duplicate entry")){String[] split = ex.getMessage().split(" ");String msg = split[2] + "已存在";return R.error(msg);}return R.error("未知错误");}
}

注解说明:

​ 上述的全局异常处理器上使用了的两个注解 @ControllerAdvice , @ResponseBody , 他们的作用分别为:

​ @ControllerAdvice : 指定拦截那些类型的控制器;

​ @ResponseBody: 将方法的返回值 R 对象转换为json格式的数据, 响应给页面;

http://www.xdnf.cn/news/220.html

相关文章:

  • AI编程方法第五弹:测试很重要
  • linux 4.14内核jffs2文件系统不自动释放空间的bug
  • ubuntu-24.04.2-live-server-arm64基于cloud-init实现分区自动扩容(LVM分区模式)
  • STC定时器频率占空比程序
  • 深入理解 Transformer:从原理解析到文本生成实践
  • 在Qt中验证LDAP账户(Windows平台)
  • 【MySQL】Ubuntu下C++连接MySQL
  • C# 点击导入,将需要的参数传递到弹窗的页面
  • C#/.NET/.NET Core拾遗补漏合集(25年4月更新)
  • DBeaver连接hive
  • Linux:简单指令(二)
  • Chromium 134 编译指南 macOS篇:编译流程(五)
  • 【20】Strongswan sa ——IKE_SA set_state|process_message|
  • QT常见显示类控件及其属性
  • 使用 Docker 安装 Elastic Stack 并重置本地密码
  • 方案解读:虚拟电厂标杆项目整体建设方案【附全文阅读】
  • [经验总结]Linux双机双网卡Keepalived高可用配置及验证细节
  • IcePlayer音乐播放器项目分析及学习指南
  • 软考高级-系统架构设计师 论文范文参考(二)
  • vscode的一些使用技巧记录
  • Qt中读写结构体字节数据
  • 若依框架修改左侧菜单栏默认选中颜色
  • 【工具】文件传输工具croc
  • WebSocket:实现实时双向通信的技术
  • 密码学中的盐值是什么?
  • 获取视频封面
  • AIGC-几款本地生活服务智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)
  • Pytorch的常规操作
  • C++11新特性
  • 【数据结构】第四弹——LinkedList与链表