服务器发生异常之后 服务器返回值不为Result格式的json数据 会导致前端工程师无法解析错误 这样就需要后端程序员在发生异常之后进行捕获然后进行操作并返回一个Result格式的JSON格式
这就是全局异常处理器的产生全局异常处理器的使用
1.需要定义一个类 在该类上用@RestControllerAdvice来声明此类为全局异常处理器
2.在该类的方法中用@ExceptionHandler来声明为异常处理方法 并为该注释的Value值输入异常的类型
3.封装异常信息package com.itheima.exception; import com.itheima.pojo.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice // 全局异常处理器 public class GlobalExceptionHandler { @ExceptionHandler(Exception.class)// 指定拦截的异常类型 public Result handlerException(Exception exception){ exception.printStackTrace(); // 打印异常信息 return Result.error("对不起 操作有误 请联系管理员!"); // 返回错误信息 } }
事务:最小的操作单元 一旦成功全部代码成功 一旦失败 全体代码都不执行
开启事务:start/begin transaction 【transaction(事务)】
提交事务 一旦成功全部提交:commit
回滚事务 一旦失败立刻回滚:rollback例如删除某一部门之后 该部门下的员工必须要被删除,则这两个操作为同一事务
在java中如何实现
1.(可有可无)在配置文件中加入事务日志输出#开启事务日志输出 logging: level: org.springframework.jdbc.support.jdbcTransactionManager: debug
2.在类中或者方法体 接口中添加@Transactional注释 意思交给spring的事务管理 如果报错会自动回滚 如果成功会自动提交
@Transactional // 将该方法交给spring的事务管理 @Override public void deleteDept(Integer id) { deptMapper.deleteDept(id) ; // 根据部门ID删除部门 int i = 10/0; //模拟出现错误 empMapper.deleteEmpsByDeptId(id) ; //删除该部门下的员工 }
@Transactional注释的属性值
1.rollbackFor属性:该属性默认值为RuntimeException.class 意思是只要在报错RuntimeException异常时才会回滚可以将该属性值设置为Excption.class@Transactional(rollbackFor = Exception.class)
2.propagation 传播行为:当A方法有事务注释 A方法调用同样也有事务注释的B时进行的事务传播行为
可以取到的属性值:
REQUIRED:默认值 需要事务如果有就加入 没有就新创一个事务
REQUIRES_NEW:需要新事务 无论有没有都要创建一个新事务
SUPPORTS:支持事务 有就加入 没有就在没有事务的情况下运行
NOT_SUPPORTED:不支持事务 在无事务的情况下运行 如果已经存在事务就先挂起该事务再运行
MANDATORY:必须有事务 没有就报错
NEVER:必须无事务 有就报错
最常见的事务传播行为就是:当删除东西时 删除被认为是很危险的行为 所以需要不管删除与否都需要打印日志到数据库@Transactional(propagation = Propagation.REQUIRES_NEW)