瑞吉的4,5拖了好几天没写
现在一次性全部还清欠下的债,都是泪
Controller层全局异常捕获
其实在之前做employee增加就可能有问题,因为表中username是unique的,如果插入重复,数据库层面肯定会报错的,进而导致mp那边报错会回会送到controller层面。
那么,(只是我估计的编程思想是)exception尽量在service去搞,回送到controller层面的exception要尽量简单,这样controller层面只需要关注与前端交互内容,同时会调service就完了。
那么这样就可以简约controller层面的try catch内容
实现controller层面自动的异常捕获:
- 编写一个类,需要添加两个注解,代码
- 编写方法,传入参数为捕获的异常
- 方法上面编写特定的注解
java
/**
* 全局捕获异常的class
* controllerAdvice表示开启全局异常捕获,
* 里面内容表示,针对含有RestController&Controller注解进行捕获
* ResponseBody,表示这个class是需要回送具体内容给前端
*/
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
/**
* 具体异常捕获处理函数
* 需要添加ExceptionHandler这个注解,里面写上异常的class文件
* @param ex 这个是捕获的异常
* @return return值是捕获到该异常直接会送给前端,后面Controller内容应该就不再执行
*/
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
log.info(ex.getMessage());
return R.error("失败了");
}
@ExceptionHandler(CustomException.class)
public R<String> categoryDel(CustomException ex){
log.info(ex.getMessage());
return R.error(ex.getMessage());
}
}
针对表级联删除操作
主要实现Category的删除,分页之前实现了,增加比较简单。主要说删
因为category是作为别的dish的逻辑外键存在的,所以删除category需要保证dish内不存在该条category
一般不对数据库进行建立外键,操控级联删除,会有速度以及数据风险,所以一般放到service层去操作。
所以现在逻辑变成了,controller直接调用service层接口,让他去删东西,service自己去检索删除,删除成功就继续走,删除失败就直接抛异常,然后刚刚的全局捕获去接受,返回失败给前端。
完成流程:
- 编写自定义exception
- 在Categoryservice接口下添加一个新的删除接口
- 完成内部逻辑
- 完成controller就结束
java
/**
* 自定义exception
* 比较简单,继承一下写一下构造方法就完了
*/
public class CustomException extends RuntimeException {
public CustomException(String message){
super(message);
}
}
/**
* 重写自己在CategoryService添加的新方法
* @param id
*/
@Override
public void remove(Long id) {
// 1. 查询是否关联菜品
LambdaQueryWrapper<Dish> dishQuery = new LambdaQueryWrapper<>();
dishQuery.eq(Dish::getCategoryId, id);
// 查到条目数
int connDishes = dishService.count(dishQuery);
if (connDishes > 0){
// throw exception
throw new CustomException("当前分类关联了菜品信息,无法删除!");
}
LambdaQueryWrapper<Setmeal> setMealQuery = new LambdaQueryWrapper<>();
setMealQuery.eq(Setmeal::getCategoryId, id);
int connSetMeals = setMealService.count(setMealQuery);
if (connSetMeals > 0){
// throw exception
throw new CustomException("当前分类关联了套餐信息,无法删除!");
}
// 2. 查询是否关联套餐
return;
}
controller就比较简单不展示了,传id进来调接口return结束