• SpringBoot SpringBoot 基础篇 4 基于 SpringBoot 的SSMP 整合案例 4.17 异常消息处理


    SpringBoot

    【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

    SpringBoot 基础篇

    4 基于 SpringBoot 的SSMP 整合案例

    4.17 异常消息处理
    4.17.1 问题引入

    之前我们好像都把增删改查功能做完了

    在这里插入图片描述

    但是吧,绝大多数操作都是我们基于理想状态进行的

    直接模拟一个异常

    @PostMapping
    public R save(@RequestBody Book book) throws Exception {
    
        if (true) {
            throw new Exception();
        }
    
        return new R(bookService.save(book));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    重启服务器,使用接口测试工具测试

    在这里插入图片描述

    可以看到,又是一种全新的返回格式【虽然也是JSON】【这就是问题】

    在这里插入图片描述

    【前端痛点!】

    4.17.2 对异常进行统一处理

    修改表现层返回结果的模型类,封装出现异常后对应的信息

    package com.dingjiaxiong.controller.utils;
    
    import lombok.Data;
    
    /**
     * ClassName: R
     * date: 2022/10/17 20:43
     *
     * @author DingJiaxiong
     */
    
    @Data
    public class R {
    
        private Boolean flag;
        private Object data;
    
        private String msg;
    
        public R() {
        }
    
        public R(Boolean flag) {
            this.flag = flag;
        }
    
        public R(Boolean flag, Object data) {
            this.flag = flag;
            this.data = data;
        }
    
        public R(Boolean flag, String msg) {
            this.flag = flag;
            this.msg = msg;
        }
    
        public R(String msg) {
            this.flag = false;
            this.msg = msg;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    处理异常类

    package com.dingjiaxiong.controller.utils;
    
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    
    /**
     * ClassName: ProjectExceptionAdvice
     * date: 2022/10/18 10:44
     * SpringMVC的异常处理器
     * @author DingJiaxiong
     */
    
    @RestControllerAdvice
    public class ProjectExceptionAdvice {
    
        //拦截所有的异常信息
        @ExceptionHandler
        public R doException(Exception ex){
            //这里面可以做的事情就多了 1. 记录日志 2. 发送消息给运维 3. 发送邮件给开发人员
            ex.printStackTrace();
            return new R("服务器故障,请稍后再试!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    重启服务器,测试

    在这里插入图片描述

    这样就又统一了

    在这里插入图片描述

    这个注解中可以添加想要拦截的异常类型

    在这里插入图片描述

    这个就是基类了【这个的意义在于,可以多写几个方法来处理不同类型的异常】

    4.17.3 完善前端页面消息处理

    没有传递消息加载默认消息,传递消息后加载指定消息

    在这里插入图片描述

    当然还有问题

    咱们正常的操作还没有给msg 值

    在这里插入图片描述

    一会儿老师应该要加

    在这里插入图片描述

    改一下接口

    先测试吧

    在这里插入图片描述

    这样就达到异常处理的效果了

    完善一下controller 的返回值

    @PostMapping
    public R save(@RequestBody Book book) throws Exception {
    
        if (book.getName().equals("123")) {
            throw new Exception();
        }
    
        boolean flag = bookService.save(book);
        return new R(flag, flag ? "添加成功^_^" : "添加失败-_-!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    修改前端

    在这里插入图片描述

    重启服务器,测试新增

    在这里插入图片描述

    这是异常情况

    在这里插入图片描述

    添加成功,OK

    回顾一下

    • 对异常进行统一处理,出现异常后,返回指定信息

      @RestControllerAdvice
      public class ProjectExceptionAdvice {
      @ExceptionHandler(Exception.class)
      public R doOtherException(Exception ex){
      //记录日志
      //发送消息给运维
      //发送邮件给开发人员,ex对象发送给开发人员
      ex.printStackTrace();
      return new R(false,null,"系统错误,请稍后再试!");
      }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 修改表现层返回结果的模型类,封装出现异常后对应的信息

      • flag = false
      • Data: null
      • 消息【msg】:要显示信息
      @Data
      public class R{
      private Boolean flag;
      private Object data;
      private String msg;
      public R(Boolean flag,Object data,String msg){
      this.flag = flag;
      this.data = data;
      this.msg = msg;
      }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 页面消息处理,没有传递消息加载默认消息,传递消息后加载指定消息

      //添加
      handleAdd () {
      //发送ajax请求
      axios.post("/books",this.formData).then((res)=>{
      //如果操作成功,关闭弹层,显示数据
      if(res.data.flag){
      this.dialogFormVisible = false;
      this.$message.success("添加成功");
      }else {
      this.$message.error(res.data.msg);
      }
      }).finally(()=>{
      this.getAll();
      });
      },
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    • 在表现层Controller中进行消息统一处理

      @PostMapping
      public R save(@RequestBody Book book) throws IOException {
      Boolean flag = bookService.insert(book);
      return new R(flag , flag ? "添加成功^_^" : "添加失败-_-!");
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 目的:国际化
    • 页面消息处理

      //添加
      handleAdd () {
      //发送ajax请求
      axios.post("/books",this.formData).then((res)=>{
      if(res.data.flag){
      this.dialogFormVisible = false;
      this.$message.success(res.data.msg);
      }else {
      this.$message.error(res.data.msg);
      }
      }).finally(()=>{
      this.getAll();
      });
      },
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    4.17.4 小结
    1. 使用注解@RestControllerAdvice定义SpringMVC异常处理器用来处理异常的
    2. 异常处理器必须被扫描加载,否则无法生效
    3. 表现层返回结果的模型类中添加消息属性用来传递消息到页面
  • 相关阅读:
    Unity - Alpha Is Transparency
    文件操作 黑马教程(04)
    Nftea: 世界杯文化、 NFT与 期权的首度碰撞
    褪去流量外衣后,质量问题频现,usmile笑容加困在同质化竞争里
    【海浪建模3】三维随机真实海浪建模以及海浪发电机建模matlab仿真
    APP为什么用JSON协议与服务端交互:序列化相关知识
    基于智慧灯杆的智慧城市解决方案(1)
    解决Oracle SQL语句性能问题——SQL语句改写(join、集合)
    【实战项目】高并发内存池(上)
    基于Python的Django出租车大数据分析系统实现
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/127828242