开源框架EL-ADMIN开发自己的 web应用(7)-异常控制

第(5)节与第(6)节仔细研究了eladmin对于后端与前端的权限控制,本节主要讨论如何在系统中进行异常控制。

1. 后端异常定义

我们还是根据源码来寻找答案,仔细研究eladmin的官网对于异常处理的说明后,我们首先来看后端异常实体类ApiError
在这里插入图片描述
这个实体中主要封装三个信息

  • 状态status,默认是400;
  • timestamp,默认是当前的时间;
  • String类型的message。
    然后再看看通用异常BadRequestException的定义
    在这里插入图片描述
    由上图可知,BadRequestException封装了status与message,message需要传入,status默认是BAD_REQUEST,我们在IDEA中按住ctrl键点击可以看到
    在这里插入图片描述
    默认BAD_REQUEST的值为400。
    官方给了两个自定义异常的实例,我们来看其中一个,EntityNotFoundException,看到名子就知道这是一个实体不存在异常,看看它的结构
    在这里插入图片描述
    这个异常类很简单,传入对象对应class类(其实主要就是获取类的名子,看箭头指示),再传入这个类的字段名,再传入字段中该类的值,然后输出消息"这个类的field字段值 val 不存在"。我们来举一个例子吧!

2. 后端已有异常类测试

首先在后端找到我们之前创建的“我的岗位管理”的gen模块,不清楚怎么利用代码生成器自动创建gen模块的请回看第(2)节与第(3)节的内容,打开MyJob这个类
在这里插入图片描述
我们发现有name字段属性,于是我们用EntityNotFoundException做一个测试,打开eladmin-system模块下的测试类EladminSystemApplicationTests,这部分代码,eladmin已经自动为我们配置好了,我们利用@Test测试方法抛出一个异常,如图:
在这里插入图片描述
利用junit运行该函数contextLoads,可以得到如下结果
在这里插入图片描述
使用就是这么简单。这里重点注意两个注解的使用
在这里插入图片描述
这两个注解保证在junit运行时会自动加载系统的上下文,这样EladminSystemApplicationTests才能识别出MyJob这个类,以后我们自己写系统的测试类时,一定要加上这两个注解。
官方还提供了一些默认的异常类(如下图),大家可以按照上面的方法自己测一下。
在这里插入图片描述

3. 后端全局异常拦截

参照官网,全局异常拦截定义在GlobalExceptionHandler中
在这里插入图片描述
这里一定要记住这两个关键注解:

  • @RestControllerAdvice:默认会扫描指定包中所有@RequestMapping注解
  • @ExceptionHandler:通过@ExceptionHandler的 value 属性可过滤拦截的条件,即按照抛出异常的类型分别进行处理
    我们来做两个例子走一下全部的流程,深刻理解一下。

3.1 测试EntityNotFoundException

首先在进入“我的岗位管理”界面查询所有岗位时,抛出异常
在这里插入图片描述
在全局异常拦截类中GlobalExceptionHandler对EntityNotFoundException相应的方法entityNotFoundException设置断点
在这里插入图片描述
运行程序,进入“我的岗位管理界面”,如下图
在这里插入图片描述
这会触发查询所有岗位的函数,于是会抛出EntityNotFoundException,可以看到
在这里插入图片描述
成功拦截到我们定义的EntityNotFoundException。

3.2 测试 MethodArgumentNotValidException

我们故意在Myjob类对于创建时间的字段中加上@NotNull,如下图
在这里插入图片描述
然后重启后端,在”我的岗位管理“新增界面中,故意在创建日期中不进行填写
在这里插入图片描述
在GlobalExceptionHandler中的 handleMethodArgumentNotValidException方法中加断点,运行过程中可以看到全局拦截器拦截到了MethodArgumentNotValidException
在这里插入图片描述

4. 前端异常拦载

官网,前端的异常拦载都在src/utils/request.js中

// response 拦截器
service.interceptors.response.use(
  response => {
    const code = response.status
    if (code < 200 || code > 300) {         
      Notification.error({
        title: response.message
      })
      return Promise.reject('error')
    } else {
      return response.data
    }
  },
  error => {
    let code = 0
    try {
      code = error.response.data.status
    } catch (e) {
      if (error.toString().indexOf('Error: timeout') !== -1) {
        Notification.error({
          title: '网络请求超时',
          duration: 5000
        })
        return Promise.reject(error)
      }
    }
    if (code) {
      if (code === 401) {
        store.dispatch('LogOut').then(() => {
          // 用户登录界面提示
          Cookies.set('point', 401)
          location.reload()
        })
      } else if (code === 403) {
        router.push({ path: '/401' })
      } else {
        const errorMsg = error.response.data.message
        if (errorMsg !== undefined) {
          Notification.error({
            title: errorMsg,
            duration: 5000
          })
        }
      }
    } else {
      Notification.error({
        title: '接口请求失败',
        duration: 5000
      })
    }
    return Promise.reject(error)
  }
)

看这段源代码很好理解,就是这样的逻辑:

  1. 如果 code < 200 || code > 300 输出错误error
  2. 如果输出error,code = error.response.data.status:
    3. 如果code存在 且 code === 401: 让重新登录
    4. 如果code存在 且 code === 403: 跳转到"/401"对应的界面
    5. 如果code存在 code为其他数值:界面以通知的形式输出erro中的message
    6. 如果code不存在,界面以通知的形式输出“接口请求失败”

参照上述流程,我们做两个例子,一个让界面以通知的形式输出我们定义的错误消息,一个让界面跳转到指定页,这两个都是我们常用的。

3.1 界面输出错误消息

按照2.1定义异常EntityNotFoundException,在进入“我的岗位管理时”,抛出EntityNotFoundException异常,观察GlobalExceptionHandler拦截器中对于该异常的处理
在这里插入图片描述
按照1ApiError的定义,我们已经知道ApiError中code默认为400,按照上述前端异常处理的逻辑,如果code=400会以通知的形式输出我们定义的message,如下图
在这里插入图片描述

3.2 错误跳转页面

还是按照2.1定义异常EntityNotFoundException,我们直接去修改GlobalExceptionHandler拦截器中对应该异常的处理方法entityNotFoundException,让其code为403
在这里插入图片描述
再次重启后端,进入“我们岗位管理”页面时,触发异常,可以看到这时就跳转到了eladmin定义的异常页面了,如下图:
在这里插入图片描述
当然你可以定义自己的异常处理页面,通过参看前面路由,我们知道”/401“路径对应的页面是:
在这里插入图片描述
你完全可以自定义一个异常处理界面替换@/views/features/401,或者重新定义一个路由指向别的页面。

4 总结

本节主要讲解了eladmin中关于前后端异常处理的机制,其实非常简单,就是spring-boot中一些基本的异常处理方法,我们完全可以直接复用eladmin的代码,如果做项目时对异常处理不熟或记得不全,完全可以回去看看eladmin源代码中异常处理的内容,如果还不懂,记得回来看我的博客,算是讲得非常清楚了。如果看了本节觉得有收获记得给我点赞,你们的支持是我更新的动力。下节还有更重要的内容,请继续关注。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值