十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
今天小编给大家分享一下SpringBoot统一接口返回及全局异常怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
网站制作、建网站找专业的建站公司成都创新互联:定制网站、模板网站、仿站、小程序制作、软件开发、app软件定制开发等。做网站价格咨询成都创新互联:服务完善、10余年建站、值得信赖!网站制作电话:13518219792
默认情况下,SpringBoot会有如下三种返回情况。
@GetMapping("/getUserName") public String getUserName(){ return "HuaGe"; }
调用接口返回结果:
HuaGe
@GetMapping("/getUserName") public User getUserName(){ return new User("HuaGe",18,"男"); }
调用接口返回结果:
{ "name": "HuaGe", "age": "18", "性别": "男", }
@GetMapping("/getUserName") public static String getUserName(){ HashMap hashMap = Maps.newHashMap(); return hashMap.get(0).toString(); }
模拟一个空指针异常,在不做任何异常处理的情况下,可以看下SpringBoot的默认返回结果:
{ "timestamp": "2021-08-09T06:56:41.524+00:00", "status": 500, "error": "Internal Server Error", "path": "/sysUser/getUserName" }
对于上面这几种情况,如果整个项目没有定义统一的返回格式,五个后台开发人员定义五种返回格式,这样不仅代码臃肿,前后端对接效率低,而且还会有一些意向不到的情况发生,比如前端直接显示异常详情等,这给用户的体验是非常差的。
项目中最常见到的是封装一个工具类,类中定义需要返回的字段信息,把需要返回前端的接口信息,通过该类进行封装,这样就可以解决返回格式不统一的现象了。
code:状态码,后台可以维护一套统一的状态码;
message:描述信息,接口调用成功/失败的提示信息;
data:返回数据。
新建Result类
public class Result{ private int code; private String message; private T data; public Result() {} public Result(int code, String message) { this.code = code; this.message = message; } /** * 成功 */ public static Result success(T data) { Result result = new Result (); result.setCode(ResultMsgEnum.SUCCESS.getCode()); result.setMessage(ResultMsgEnum.SUCCESS.getMessage()); result.setData(data); return result; } /** * 失败 */ public static Result error(int code, String message) { return new Result(code, message); } }
定义返回状态码
public enum ResultMsgEnum { SUCCESS(0, "成功"), FAIL(-1, "失败"), AUTH_ERROR(502, "授权失败!"), SERVER_BUSY(503, "服务器正忙,请稍后再试!"), DATABASE_OPERATION_FAILED(504, "数据库操作失败"); private int code; private String message; ResultMsgEnum(int code, String message) { this.code = code; this.message = message; } public int getCode() { return this.code; } public String getMessage() { return this.message; } }
使用方式
上面两步定义了数据返回格式
和状态码
,接下来就要看下在接口中如何使用了。
@GetMapping("/getUserName") public Result getUserName(){ return Result.success("huage"); }
调用结果如下,可以看到是我们在Result中定义的参数类型。
{ "code": 0, "message": "成功", "data": "huage" }
这样写虽然能够满足日常需求,而且我相信很多小伙伴也是这么用的,但是如果我们有大量的接口,然后在每一个接口中都使用Result.success
来包装返回信息,会新增很多重复代码,显得不够优雅,甚至都不好意思拿出去显摆。 肯定会有一种方式能够再一次提高代码逼格,实现最优解。
基本用法学会后,接下来看点究极版本,主要用到如下两个知识点,用法简单,无论是拿出来教学妹,还是指点小姐姐,都是必备技能。
ResponseBodyAdvice:该接口是SpringMVC 4.1提供的,它允许在 执行 @ResponseBody
后自定义返回数据,用来封装统一数据格式返回;
@RestControllerAdvice:该注解是对Controller进行增强的,可以全局捕获抛出的异常。
新建ResponseAdvice
类;
实现ResponseBodyAdvice
接口,实现supports
、beforeBodyWrite
方法;
该类用于统一封装controller中接口的返回结果。
@RestControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice