厦门哪家网站建设最好,个人对网络营销的看法,做网站必须要注册公司么,定襄网站建设SpringBoot教程(八) | SpringBoot统一结果封装
经过了前面几篇文章#xff0c;SpringBoot中MVC相关的配置其实都已经差不多了#xff0c;接下来就可以完全进入接口开发阶段了。前面我们写过几个接口#xff0c;虽然都加了RestController注解#xff0c;相当于统一了我们的…SpringBoot教程(八) | SpringBoot统一结果封装
经过了前面几篇文章SpringBoot中MVC相关的配置其实都已经差不多了接下来就可以完全进入接口开发阶段了。前面我们写过几个接口虽然都加了RestController注解相当于统一了我们的返回数据的基本形式为JSON但是由于我们的项目可能是很多人一起开发所以我们最好能够把我们的返回结果统一一下让大家都返回一样的数据格式这样即规范了代码也方便了前端人员的调用不然每个人都按照每个人的风格去写代码会变得非常混乱。
那我我们怎么还封装这个结果呢那就要关注我们返回给前端的数据都要包含哪些信息。
一般来讲首先要有一个code, 用来代表我们这次接口的一个状态比如 0代表成功1代表失败2代表必传参数不对 4代表系统异常等等。这只是个简单的举例。可能很多人会有疑问Http协议本身不是已经有了相应的返回码的定义了么比如200代表成功 500代表服务器错误404代表找不到页面为啥咱们还要在定义呢这就是划分粒度的问题了就那200来说它代表是这次请求成功了但是它描述不了这次请求中的业务结果比如用户名已存在其实业务上就不是一种成功但http的结果肯定是200所以我们需要一种描述我们业务状态的编码。
除了编码之外还有要一些提示信息比如操作成功系统异常用户名已存在等所以我们再加一个messge字段。
还有什么呢还有我们的核心数据比如我根据id获取数据那个这个数据的具体内容我们肯定是必须要返回给前端呢所以还要 有个data 那这个data 用什么类型呢这个类型肯定是五花八门所以我们要用一个统一的父类Object才可以接收所有类型当然为了便于操作我们可以采用泛型的方式。
通过上面的分析我们的这个类基本上就已经可以设计出来了。
java复制代码public class ResultT implements Serializable {private static final long serialVersionUID -3960261604605958516L;private int code;private String msg;private T data;// get set方法限于篇幅问题这里不写了大家操作的时候自己生成一下。或者使用lombokpublic static T ResultT success() {return new Result();}/*** 成功,默认状态码,返回消息,自定义返回数据** param data 自定义返回数据* param T 返回类泛型,不能为String* return 通用返回Result*/public static T ResultT success(T data) {return new Result(data);}/*** 成功,默认状态码,自定义返回消息,无返回数据** param msg 自定义返回消息* param T 返回类泛型* return 通用返回Result*/public static T ResultT success(String msg) {return new Result(msg);}/*** 成功,默认状态码,自定义返回消息,返回数据** param msg 自定义返回消息* param data 自定义返回数据* param T 返回类泛型* return 通用返回Result*/public static T ResultT success(String msg, T data) {return new Result(msg, data);}/*** 失败,默认状态码,返回消息,无返回数据** param T 返回类泛型* return 通用返回Result*/public static T ResultT error() {return new Result(ResultCode.ERROR);}/*** 失败,默认状态码,自定义返回消息,无返回数据** param T 返回类泛型* return 通用返回Result*/public static T ResultT error(String msg) {return new Result(ResultCode.ERROR.getCode(), msg);}/*** 失败,自定义状态码,返回消息,无返回数据** param code 自定义状态码* param msg 自定义返回消息* param T 返回类泛型* return 通用返回Result*/public static T ResultT error(int code, String msg) {return new Result(code, msg);}/*** 失败,使用CodeMsg状态码,返回消息,无返回数据** param resultCode CodeMsg,参数如下:* p code 状态码* p msg 返回消息* param T 返回类泛型* return 通用返回Result*/public static T ResultT error(ResultCode resultCode) {return new Result(resultCode);}/*** 成功构造器,无返回数据*/private Result() {this(ResultCode.SUCCESS);}/*** 成功构造器,自定义返回数据** param data 返回数据*/private Result(T data) {this(ResultCode.SUCCESS, data);}/*** 成功构造器,自定义返回消息,无返回数据** param msg 返回消息*/private Result(String msg) {this(ResultCode.SUCCESS.getCode(), msg);}/*** 成功构造器,自定义返回信息,返回数据** param msg 返回信息* param data 返回数据*/private Result(String msg, T data) {this(ResultCode.SUCCESS.getCode(), msg, data);}/*** 构造器,自定义状态码,返回消息** param code 状态码* param msg 返回消息*/private Result(int code, String msg) {this.code code;this.msg msg;}/*** 构造器,自定义状态码,返回消息,返回数据** param code 状态码* param msg 返回消息* param data 返回数据*/private Result(int code, String msg, T data) {this(code, msg);this.data data;}/*** 构造器,使用CodeMsg状态码与返回信息** param resultCode CodeMsg,参数如下:* p code 状态码* p msg 返回消息*/private Result(ResultCode resultCode) {this(resultCode.getCode(), resultCode.getMsg());}/*** 构造器,使用CodeMsg状态码与返回信息,自定义返回数据** param resultCode CodeMsg,参数如下:* p code 状态码* p msg 返回消息* param data 返回数据*/private Result(ResultCode resultCode, T data) {this(resultCode);this.data data;}}在定义几个常见的错误这里为了不写那么多的getset,我们引入了lombok
java复制代码Data
Builder
public class ResultCode implements Serializable {private static final long serialVersionUID -6269841958947880397L;/*** 状态码*/private int code;/*** 状态信息*/private String msg;/*** 默认成功*/public final static ResultCode SUCCESS dispose(ResultCodeEnum.SUCCESS);/*** 默认失败*/public final static ResultCode ERROR dispose(ResultCodeEnum.ERROR);/*** 通用业务异常*/public final static ResultCode BIZ_ERROR dispose(ResultCodeEnum.BIZ_ERROR);/*** 文件超出最大限制*/public final static ResultCode FILE_OUT_MAX dispose(ResultCodeEnum.FILE_OUT_MAX);/*** 文件格式不正确*/public final static ResultCode FILE_FORMAT_ERROR dispose(ResultCodeEnum.FILE_FORMAT_ERROR);/*** 参数错误*/public final static ResultCode PARAM_ERROR dispose(ResultCodeEnum.PARAM_ERROR);/*** Json解析异常*/public final static ResultCode JSON_FORMAT_ERROR dispose(ResultCodeEnum.JSON_FORMAT_ERROR);/*** Sql解析异常*/public final static ResultCode SQL_ERROR dispose(ResultCodeEnum.SQL_ERROR);/*** 网络超时*/public final static ResultCode NETWORK_TIMEOUT dispose(ResultCodeEnum.NETWORK_TIMEOUT);/*** 未知的接口*/public final static ResultCode UNKNOWN_INTERFACE dispose(ResultCodeEnum.UNKNOWN_INTERFACE);/*** 请求方式不支持*/public final static ResultCode REQ_MODE_NOT_SUPPORTED dispose(ResultCodeEnum.REQ_MODE_NOT_SUPPORTED);/*** 系统异常*/public final static ResultCode SYS_ERROR dispose(ResultCodeEnum.SYS_ERROR);private static ResultCode dispose(ResultCodeEnum codeEnum) {return ResultCode.builder().code(codeEnum.getCode()).msg(codeEnum.getMsg()).build();}public ResultCode(int code, String msg) {this.code code;this.msg msg;}
}
java复制代码public enum ResultCodeEnum {SUCCESS(0, 操作成功),ERROR(1, 操作失败),BIZ_ERROR(1000, 通用业务异常),FILE_OUT_MAX(9000, 文件超出最大限制),FILE_FORMAT_ERROR(9001, 文件格式不正确),PARAM_ERROR(9050, 参数错误),JSON_FORMAT_ERROR(9051, Json解析异常),SQL_ERROR(9052, Sql解析异常),NETWORK_TIMEOUT(9510, 网络超时),UNKNOWN_INTERFACE(9520, 未知的接口),REQ_MODE_NOT_SUPPORTED(9530, 请求方式不支持),SYS_ERROR(9999, 系统异常);/*** 状态码*/private final int code;/*** 状态信息*/private final String msg;public int getCode() {return code;}public String getMsg() {return msg;}ResultCodeEnum(int code, String msg) {this.code code;this.msg msg;}
}这个写完了以后就可以统一我们的返回结果以后所有的Controller就都要返回Result类型。比如
java复制代码GetMapping(/withinRangeResource)public ResultListEmergencyExpertResVO withinRangeResource(Valid ResourceRangeReqVO param) {ListEmergencyExpertResVO expertResVOS emergencyExpertBiz.getWithinRangeResource(param);return Result.success(expertResVOS);}另 配套项目代码已托管中gitCode: gitcode.net/lsqingfeng/…