【Javaweb】【瑞吉外卖】controller层全局异常捕获&级联表删除&CRUD

瑞吉的4,5拖了好几天没写

现在一次性全部还清欠下的债,都是泪

Controller层全局异常捕获

其实在之前做employee增加就可能有问题,因为表中username是unique的,如果插入重复,数据库层面肯定会报错的,进而导致mp那边报错会回会送到controller层面。

那么,(只是我估计的编程思想是)exception尽量在service去搞,回送到controller层面的exception要尽量简单,这样controller层面只需要关注与前端交互内容,同时会调service就完了。

那么这样就可以简约controller层面的try catch内容

实现controller层面自动的异常捕获:

  1. 编写一个类,需要添加两个注解,代码
  2. 编写方法,传入参数为捕获的异常
  3. 方法上面编写特定的注解
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自己去检索删除,删除成功就继续走,删除失败就直接抛异常,然后刚刚的全局捕获去接受,返回失败给前端。

完成流程:

  1. 编写自定义exception
  2. 在Categoryservice接口下添加一个新的删除接口
  3. 完成内部逻辑
  4. 完成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结束

相关推荐
_Evan_Yao20 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd20 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼20 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool11226621 小时前
TCP 1
java·1024程序员节
paopaokaka_luck1 天前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
金銀銅鐵1 天前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手1 天前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck1 天前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428041 天前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
考虑考虑1 天前
JDK26的JEP 500属性
java·后端·java ee