javaWeb-异常处理和事务管理

异常处理

我们的代码出现异常之后,异常会向上抛出,直到抛给Spring框架,会去响应一个错误结果

我们要想处理异常,可以在Controller的方法中去捕获异常,但这样做很繁琐,常常我们会定义一个全局异常处理器来处理异常,处理完成去返回响应结果。

1.定义一个异常处理器类,类上加上@RestControllerAdvice注解,表名定义一个全局异常处理器。

2。类中定义一个方法来捕获异常,方法上需要加上注解@ExceptionHandler(类名) 来指定注解捕获异常的类型。方法中的内容用来处理异常。

注意: RestControllerAdvice=@ControllerAdvvice+@ResponseBody, 所以方法的返回值会转化成json响应给前端

事务管理

当我们想要执行事务操作 可以使用注解:@Transactional

  • 位置:业务(service)层的方法上、类上、接口上,作用在类上表示当前类的所有方法都交由Spring的事务管理,作用在接口上表示当前的接口的所有类的所有方法都交给Spring进行事务管理
  • 作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务

属性:rollbackFor= 异常的类

默认情况下,只有出现RuntimeException才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。

事务的传播行为:

假设我们的a方法进行事务操作,a方法中调用了b方法。b方法也有事务,那么b的事务是加入a的事务还是自己进行新事务一起回滚呢?

可以通过属性 propagation=Propagation.属性值进行配置

举个例子,当我们要进行解散部门操作,解散部门需要部门删除部门的员工,需要进行事务操作,同时我们要记录日志操作,无论成功与否都要通过调用日志插入方法进行日志记录。

java 复制代码
//日志插入接口
@Transactional
@Override
public void insert (DeptLog deptLog) {
deptLogMapper.insert (deptLog) ;
}

我们可以知道插入日志的方法是不能跟删除部门方法一起回滚的,是创建新事务,所以使用REQUIRES_NEW

java 复制代码
@Transactional(propagation=Propagation.REQUIRES_NEW)

@Override
public void deete (Integer id) throws Exception {
try{
deptMapper.deleteById(id);//根据ID删除部门数据

int i = 1/0;
}

finally
{
empMapper.deleteByDeptId(id);//根据部门ID删除该部门下的员工

DeptLog deptLog = new DeptLog () ;
deptLog.setCreateTime (LocalDateTime.now());
deptLog.setDescription("执行了解散部门的操作,此次解散的是"+id+"号部门");
deptLogService.insert (deptLog) ;
}

事务日志开启开关:

开启后的日志显示:

插件:Grep Console 能够高光筛选日志

相关推荐
ywl4708120873 分钟前
springSecurity+jwt,简单版demo
java·前端·servlet
ZHW_AI课题组18 分钟前
Python 调用百度智能云 API 实现地址识别
开发语言·人工智能·python·机器学习·百度·数据挖掘
SXJR26 分钟前
spring boot + langchain4j +milvus实现向量存储
java·spring boot·后端·大模型·milvus·rag·langchain4j
武子康30 分钟前
Java-27 深入浅出 Spring - 实现简易Ioc-03 在上节的业务下手动实现IoC 从 XML 配置到 BeanFactory 反射注入
java·后端·mybatis
88号技师36 分钟前
2026年2月一区SCI-交叉传播优化算法Propagation Alongside Crossover-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
二哈赛车手36 分钟前
新人笔记---idea索引失效问题解决方案
java·笔记·spring·elasticsearch·intellij-idea
A.零点41 分钟前
【2个月 C 语言从入门到精通:零基础系统教程】第十二讲:深入了解指针(五)
c语言·开发语言·网络·笔记·visual studio
飞天狗1111 小时前
零基础JavaWeb入门——第五课第一小节:九大内置对象 · 第1个:request(请求对象)
java·开发语言·前端·后端·servlet
z落落1 小时前
C#ToolStrip+StatusStrip 状态栏实时显示系统时间+NotifyIcon系统托盘
开发语言·c#
a15108416931 小时前
记一次大模型探索
java·服务器·前端