现在大多数公司项目框架,基本都是属于前后端分离模式,这种模式会涉及到一个前后端对接问题,无论是对前端或者是后台服务,维护一套完善且规范的接口是非常有必要的,
这样不仅能够提高对接效率,也可以让我的代码看起来更加简洁优雅。
修改前后最大的区别是我们不用在每个接口单独捕获异常,也不用在每个接口都要组装一遍返回参数,可以参考下面这张对比图:
一、SpringBoot不使用统一返回格式
默认情况下,SpringBoot会有如下三种返回情况。
1.1 字符串
调用接口返回结果:
1.2 实体类
调用接口返回结果:
1.3异常返回
模拟一个空指针异常,在不做任何异常处理的情况下,可以看下SpringBoot的默认返回结果:
对于上面这几种情况,如果整个项目没有定义统一的返回格式,五个后台开发人员定义五种返回格式,
这样不仅代码臃肿,前后端对接效率低,而且还会有一些意向不到的情况发生,比如前端直接显示异常详情等,这给用户的体验是非常差的。
二、基础玩法
项目中最常见到的是封装一个工具类,类中定义需要返回的字段信息,把需要返回前端的接口信息,通过该类进行封装,这样就可以解决返回格式不统一的现象了。
2.1 参数说明
- code: 状态码,后台可以维护一套统一的状态码;
- message: 描述信息,接口调用成功/失败的提示信息;
- data: 返回数据。
2.2 流程说明
- 新建Result类
- 定义返回状态码
- 使用方式
上面两步定义了
数据返回格式和
状态码,接下来就要看下在接口中如何使用了。
调用结果如下,可以看到是我们在Result中定义的参数类型。
这样写虽然能够满足日常需求,而且我相信很多小伙伴也是这么用的,但是如果我们有大量的接口,然后在每一个接口中都使用
Result.success来包装返回信息,会新增很多重复代码,显得不够优雅,甚至都不好意思拿出去显摆。 肯定会有一种方式能够再一次提高代码逼格,实现最优解。
三、进阶用法
基本用法学会后,接下来看点究极版本,主要用到如下两个知识点,用法简单,无论是拿出来教学妹,还是指点小姐姐,都是必备技能。
3.1 类介绍
3.1类介绍
3.1 类介绍
-
ResponseBodyAdvice: 该接口是SpringMVC 4.1提供的,它允许在 执行
@ResponseBody后自定义返回数据,用来封装统一数据格式返回; - @RestControllerAdvice: 该注解是对Controller进行增强的,可以全局捕获抛出的异常。
3.2 用法说明
-
新建
ResponseAdvice类; -
实现
ResponseBodyAdvice接口,实现supports、beforeBodyWrite方法; - 该类用于统一封装controller中接口的返回结果。
我们可以通过
getUserName接口测试一下,会发现和直接使用
Result返回的结果是一致的。
不过,细心的小伙伴们肯定注意到了,在
ResponseAdvice我们全部使用了
Result.success(o)来处理结果,对于error类型的结果未做处理。我们来看下,发生异常情况时,返回结果是什么样呢?继续使用上面HashMap空指针异常的代码,测试结果如下:
虽然格式上没有毛病,但是在code、data字段的具体数据上是不友好或不正确的。不处理好这些事情,会严重影响自己在前端妹妹心中的高大形象的,这是决不能容忍的。
3.3 全局异常处理器
以前我们遇到异常时,第一时间想到的应该是try..catch..finnal吧,不过这种方式会导致大量代码重复,维护困难,逻辑臃肿等问题,这不是我们想要的结果。
今天我们要用的全局异常处理方式,用起来是比较简单的。首先新增一个类,增加
@RestControllerAdvice注解,该注解的作用花哥上面已经介绍过,就不再唠叨了。
如果我们有想要拦截的异常类型,就新增一个方法,使用
@ExceptionHandler注解修饰,注解参数为目标异常类型。
例如:controller中接口发生Exception异常时,就会进入到
Execption方法中进行捕获,将杂乱的异常信息,转换成指定格式后交给
ResponseAdvice方法进行统一格式封装并返回给前端小伙伴。
再次调用接口
getUserName查看返回结果,会发现还是有一些问题,因为我们在
CustomerExceptionHandler中已经将接口返回结果封装成
Result类型,而代码执行到统一结果返回类
ResponseAdvice时,又会结果再次封装,就出现了如下问题。
3.4 统一返回结果处理类最终版
解决上述问题非常简单,只要在
beforeBodyWrite中增加一条判断即可。
至此,本章的任务就全部讲完,上述代码可以直接引用,不需要其他的配置项,非常推荐引用到自己的项目中。
四、总结
本章讲解的内容不是很多,主要就两个类的配置,即处理统一返回结果的类
ResponseAdvice和异常处理类
CustomerExceptionHandler。全文围绕
RestControllerAdvice、
ResponseBodyAdvice的使用,通过一步步的迭代,最终构建一套通用的代码代码返回格式。本文属于实用知识分享,不知道小伙伴们还有其他好用的统一处理方案嘛,如果有更好的方案,可以分享出来大家一块学习。
最后
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。
现在竞争这么激烈,只有通过不断学习,提高自己,才能保持竞争力。
对于一些不知道学习什么,没有一个系统路线的程序员,这里给大家提供一些学习资料
需要完整版的小伙伴,可以一键三连后, 点击这里!
《Java核心知识点合集(283页)》
内容涵盖:Java基础、JVM、高并发、多线程、分布式、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、数据库、云计算等
《Java中高级核心知识点合集(524页)》
《Java高级架构知识点整理》
《Docker从入门到实践》
《spring could 学习笔记》
《JVM与性能调优知识点整理》
《MySQL性能调优与架构设计解析文档》305页
《Nginx入门到实战》319页
《Java并发编程》385页
《1000道 互联网Java工程师面试题 (485页)》
需要完整版的小伙伴,可以一键三连后, 点击这里!