SpringBoot写后端接口,看这一篇就够了( 三 )
我们再来看下这次校验失败后的响应数据:
没错 , 这次返回的就是我们制定的错误提示信息!我们通过全局异常处理优雅的实现了我们想要的功能!以后我们再想写接口参数校验 , 就只需要在入参的成员变量上加上Validator校验规则注解 , 然后在参数上加上@Valid注解即可完成校验 , 校验失败会自动返回错误提示信息 , 无需任何其他代码!更多的校验思路:SpringBoot实现通用的接口参数校验
自定义异常全局处理当然不会只能处理一种异常 , 用途也不仅仅是对一个参数校验方式进行优化 。 在实际开发中 , 如何对异常处理其实是一个很麻烦的事情 。 传统处理异常一般有以下烦恼:
- 是捕获异常(try…catch)还是抛出异常(throws)
- 是在controller层做处理还是在service层处理又或是在dao层做处理
- 处理异常的方式是啥也不做 , 还是返回特定数据 , 如果返回又返回什么数据
- 不是所有异常我们都能预先进行捕捉 , 如果发生了没有捕捉到的异常该怎么办?
全局异常处理的基本使用方式大家都已经知道了 , 我们接下来更进一步的规范项目中的异常处理方式:自定义异常 。
在很多情况下 , 我们需要手动抛出异常 , 比如在业务层当有些条件并不符合业务逻辑 , 我这时候就可以手动抛出异常从而触发事务回滚 。 那手动抛出异常最简单的方式就是throw new RuntimeException("异常信息")了 , 不过使用自定义会更好一些:
- 自定义异常可以携带更多的信息 , 不像这样只能携带一个字符串 。
- 项目开发中经常是很多人负责不同的模块 , 使用自定义异常可以统一了对外异常展示的方式 。
- 自定义异常语义更加清晰明了 , 一看就知道是项目中手动抛出的异常 。
@Getter //只要getter方法 , 无需setterpublic class APIException extends RuntimeException {private int code;private String msg;public APIException() {this(1001, "接口错误");}public APIException(String msg) {this(1001, msg);}public APIException(int code, String msg) {super(msg);this.code = code;this.msg = msg;}}
在刚才的全局异常处理类中记得添加对我们自定义异常的处理:@ExceptionHandler(APIException.class)public String APIExceptionHandler(APIException e) {return e.getMsg();}
这样就对异常的处理就比较规范了 , 当然还可以添加对Exception的处理 , 这样无论发生什么异常我们都能屏蔽掉然后响应数据给前端 , 不过建议最后项目上线时这样做 , 能够屏蔽掉错误信息暴露给前端 , 在开发中为了方便调试还是不要这样做 。现在全局异常处理和自定义异常已经弄好了 , 不知道大家有没有发现一个问题 , 就是当我们抛出自定义异常的时候全局异常处理只响应了异常中的错误信息msg给前端 , 并没有将错误代码code返回 。 这就要引申出我们接下来要讲的东西了:数据统一响应
数据统一响应现在我们规范好了参数校验方式和异常处理方式 , 然而还没有规范响应数据!比如我要获取一个分页信息数据 , 获取成功了呢自然就返回的数据列表 , 获取失败了后台就会响应异常信息 , 即一个字符串 , 就是说前端开发者压根就不知道后端响应过来的数据会是啥样的!所以 , 统一响应数据是前后端规范中必须要做的!
自定义统一响应体统一数据响应第一步肯定要做的就是我们自己自定义一个响应体类 , 无论后台是运行正常还是发生异常 , 响应给前端的数据格式是不变的!那么如何定义响应体呢?关于异常的设计:如何更优雅的设计异常
推荐阅读
- 脑机接口发展失控,人类或将成为变形金刚,马斯克也很无奈
- 375W喂不饱:技嘉给RTX 3080悄悄增加了一个供电接口
- 接口|DP接口不比HDMI差甚至还免费 为何电视厂商不用?
- 阿里达摩院发布2021十大科技趋势,人类有望借脑机接口超越生物学极限
- 不换接口、开放内存超频,11代酷睿平台更厚道了
- 银欣推出MS12金属移动硬盘盒:采用20Gbps USB-C接口
- 计算机专业的同学在掌握了Java之后,还可以学习哪门后端语言
- M.2接口竟然也能装显卡 4K无压力
- 为什么移动硬盘不建议插在台式机前置USB接口上?看完长知识了
- 技嘉发布1TB版Vision Drive移动固态硬盘:采用20Gbps USB-C接口