• 14:第二章:架构后端项目:10:封装“返回结果”;(也就是定义API统一返回对象)(同时,使用枚举类统一管理错误信息)


    说明:

    (1)在【Spring Boot电商项目14:用户模块三:API统一返回对象;(其中,涉及了【使用枚举类,来管理接口请求失败时,将要向前端返回的(状态码)和(错误信息)】;)】中,我们定义了API统一返回对象;;;本篇博客的内容,基本也是一样的;

    (2)然后,本篇博客中的内容,个人感觉没有【Spring Boot电商项目14:用户模块三:API统一返回对象;】中的优雅;

    目录

    一:初始版:IMOOCJSONResult类;

    二:完美版:ResponseStatusEnum枚举类,GraceJSONResult类;


    一:初始版:IMOOCJSONResult类;

    IMOOCJSONResult类:

    1. package com.imooc.grace.result;
    2. /**
    3. *
    4. * @Title: IMOOCJSONResult.java
    5. * @Package com.imooc.utils
    6. * @Description: 自定义响应数据结构
    7. * 本类可提供给 H5/ios/安卓/公众号/小程序 使用
    8. * 前端接受此类数据(json object)后,可自行根据业务去实现相关功能
    9. *
    10. *
    11. * 响应业务状态码:
    12. * 200:表示成功
    13. * 500:表示错误,错误信息在msg字段中
    14. * 501:bean验证错误,不管多少个错误都以map形式返回
    15. * 502:拦截器拦截到用户token出错
    16. * 555:异常抛出信息
    17. * 556: 用户qq校验异常
    18. * 557: 校验用户是否在CAS登录,用户门票的校验
    19. * @Copyright: Copyright (c) 2020
    20. * @Company: www.imooc.com
    21. * @author 慕课网 - 风间影月
    22. * @version V1.0
    23. */
    24. public class IMOOCJSONResult {
    25. // 响应业务状态
    26. private Integer status;
    27. // 响应消息
    28. private String msg;
    29. // 响应中的数据
    30. private Object data;//具体返回的数据
    31. private String ok; // 不使用
    32. /**
    33. * 通过传入【status,msg,data】得到IMOOCJSONResult对象;
    34. */
    35. public static IMOOCJSONResult build(Integer status, String msg, Object data) {
    36. return new IMOOCJSONResult(status, msg, data);//去调用后面编写的三参构造;
    37. }
    38. /**
    39. * 通过传入【status,msg,data,OK】得到IMOOCJSONResult对象;
    40. */
    41. public static IMOOCJSONResult build(Integer status, String msg, Object data, String ok) {
    42. return new IMOOCJSONResult(status, msg, data, ok);//去调用后面编写的四参构造;
    43. }
    44. /**
    45. * 通过传入【data】得到IMOOCJSONResult对象:200,OK,data;
    46. */
    47. public static IMOOCJSONResult ok(Object data) {
    48. return new IMOOCJSONResult(data);//去调用后面编写的一参构造;
    49. }
    50. /**
    51. *没有任何参数,得到默认成功时的IMOOCJSONResult对象;200,OK,null;
    52. */
    53. public static IMOOCJSONResult ok() {
    54. return new IMOOCJSONResult(null);//去调用后面编写的无参构造;
    55. }
    56. /**
    57. * 业务产生500错误时,可以通过这个方法,得到对应的IMOOCJSONResult对象:500,msg,null;
    58. */
    59. public static IMOOCJSONResult errorMsg(String msg) {
    60. return new IMOOCJSONResult(500, msg, null);//去调用后面编写的三参构造;
    61. }
    62. /**
    63. * 业务产生557“校验用户是否在CAS登录,用户门票的校验”发生错误时,
    64. * 可以通过这个方法,得到对应的IMOOCJSONResult对象:557,msg,null;
    65. */
    66. public static IMOOCJSONResult errorUserTicket(String msg) {
    67. return new IMOOCJSONResult(557, msg, null);
    68. }
    69. /**
    70. * 业务产生501“bean验证错误,不管多少个错误都以map形式返回”的这个错误时,
    71. * 可以通过这个方法,得到对应的IMOOCJSONResult对象:501,“error”,data;
    72. */
    73. public static IMOOCJSONResult errorMap(Object data) {
    74. return new IMOOCJSONResult(501, "error", data);
    75. }
    76. /**
    77. * 业务产生502“拦截器拦截到用户token出错”的这个错误时,
    78. * 可以通过这个方法,得到对应的IMOOCJSONResult对象:502,msg,null;
    79. */
    80. public static IMOOCJSONResult errorTokenMsg(String msg) {
    81. return new IMOOCJSONResult(502, msg, null);
    82. }
    83. /**
    84. * 业务产生555“异常抛出信息”时,
    85. * 可以通过这个方法,得到对应的IMOOCJSONResult对象:555,msg,null;
    86. */
    87. public static IMOOCJSONResult errorException(String msg) {
    88. return new IMOOCJSONResult(555, msg, null);
    89. }
    90. /**
    91. * 业务产生556“用户qq校验异常”这个错误时,
    92. * 可以通过这个方法,得到对应的IMOOCJSONResult对象:556,msg,null;
    93. */
    94. public static IMOOCJSONResult errorUserQQ(String msg) {
    95. return new IMOOCJSONResult(556, msg, null);
    96. }
    97. /**
    98. * 无参构造
    99. */
    100. public IMOOCJSONResult() {
    101. }
    102. /**
    103. * 三参构造
    104. */
    105. public IMOOCJSONResult(Integer status, String msg, Object data) {
    106. this.status = status;
    107. this.msg = msg;
    108. this.data = data;
    109. }
    110. /**
    111. * 四参构造
    112. */
    113. public IMOOCJSONResult(Integer status, String msg, Object data, String ok) {
    114. this.status = status;
    115. this.msg = msg;
    116. this.data = data;
    117. this.ok = ok;
    118. }
    119. /**
    120. * 一参构造
    121. */
    122. public IMOOCJSONResult(Object data) {
    123. this.status = 200;
    124. this.msg = "OK";
    125. this.data = data;
    126. }
    127. public Boolean isOK() {
    128. return this.status == 200;
    129. }
    130. public Integer getStatus() {
    131. return status;
    132. }
    133. public void setStatus(Integer status) {
    134. this.status = status;
    135. }
    136. public String getMsg() {
    137. return msg;
    138. }
    139. public void setMsg(String msg) {
    140. this.msg = msg;
    141. }
    142. public Object getData() {
    143. return data;
    144. }
    145. public void setData(Object data) {
    146. this.data = data;
    147. }
    148. public String getOk() {
    149. return ok;
    150. }
    151. public void setOk(String ok) {
    152. this.ok = ok;
    153. }
    154. }

    说明:

    (1)这个类是什么作用、为什么要有这个类、什么时候使用,都要很容易理解,就不重复啰嗦;不明白的看代码注释;

    (2)只是需要明确以下几点:

              ● 我们在实际工作中,接口对返回数据的格式要求,一般都是这样的【status,msg,data】;;;但心里要清楚,后端究竟要返回什么格式的数据,是有接口文档规定的,这个需要前端约定好的;

              ● 当我们在开具体业务的某个接口时候,什么情况返回什么样的具体结果,也时需要遵守接口文档规定的(自然,这个需要前端约定好的),然后我们去调用IMOOCJSONResult对应的方法,得到对应的IMOOCJSONResult对象就行了;

    (3)但是,和【Spring Boot电商项目14:用户模块三:API统一返回对象;(其中,涉及了【使用枚举类,来管理接口请求失败时,将要向前端返回的(状态码)和(错误信息)】;)】对比后,发现IMOOCJSONResult存在一些不足:我么应该使用枚举类来管理一些常见的错误信息;完美版的参见下一部分;


    二:完美版:ResponseStatusEnum枚举类,GraceJSONResult类;

    ResponseStatusEnum枚举类:

    1. package com.imooc.grace.result;
    2. /**
    3. * 响应结果枚举,用于提供给GraceJSONResult返回给前端的
    4. * 本枚举类中包含了很多的不同的状态码供使用,可以自定义
    5. * 便于更优雅的对状态码进行管理,一目了然
    6. */
    7. public enum ResponseStatusEnum {
    8. SUCCESS(200, true, "操作成功!"),
    9. FAILED(500, false, "操作失败!"),
    10. // 50x
    11. UN_LOGIN(501,false,"请登录后再继续操作!"),
    12. TICKET_INVALID(502,false,"会话失效,请重新登录!"),
    13. NO_AUTH(503,false,"您的权限不足,无法继续操作!"),
    14. MOBILE_ERROR(504,false,"短信发送失败,请稍后重试!"),
    15. SMS_NEED_WAIT_ERROR(505,false,"短信发送太快啦~请稍后再试!"),
    16. SMS_CODE_ERROR(506,false,"验证码过期或不匹配,请稍后再试!"),
    17. USER_FROZEN(507,false,"用户已被冻结,请联系管理员!"),
    18. USER_UPDATE_ERROR(508,false,"用户信息更新失败,请联系管理员!"),
    19. USER_INACTIVE_ERROR(509,false,"请前往[账号设置]修改信息激活后再进行后续操作!"),
    20. FILE_UPLOAD_NULL_ERROR(510,false,"文件不能为空,请选择一个文件再上传!"),
    21. FILE_UPLOAD_FAILD(511,false,"文件上传失败!"),
    22. FILE_FORMATTER_FAILD(512,false,"文件图片格式不支持!"),
    23. FILE_MAX_SIZE_ERROR(513,false,"仅支持500kb大小以下的图片上传!"),
    24. FILE_NOT_EXIST_ERROR(514,false,"你所查看的文件不存在!"),
    25. USER_STATUS_ERROR(515,false,"用户状态参数出错!"),
    26. // 自定义系统级别异常 54x
    27. SYSTEM_INDEX_OUT_OF_BOUNDS(541, false, "系统错误,数组越界!"),
    28. SYSTEM_ARITHMETIC_BY_ZERO(542, false, "系统错误,无法除零!"),
    29. SYSTEM_NULL_POINTER(543, false, "系统错误,空指针!"),
    30. SYSTEM_NUMBER_FORMAT(544, false, "系统错误,数字转换异常!"),
    31. SYSTEM_PARSE(545, false, "系统错误,解析异常!"),
    32. SYSTEM_IO(546, false, "系统错误,IO输入输出异常!"),
    33. SYSTEM_FILE_NOT_FOUND(547, false, "系统错误,文件未找到!"),
    34. SYSTEM_CLASS_CAST(548, false, "系统错误,类型强制转换错误!"),
    35. SYSTEM_PARSER_ERROR(549, false, "系统错误,解析出错!"),
    36. SYSTEM_DATE_PARSER_ERROR(550, false, "系统错误,日期解析出错!"),
    37. // admin 管理系统 56x
    38. ADMIN_USERNAME_NULL_ERROR(561, false, "管理员登录名不能为空!"),
    39. ADMIN_USERNAME_EXIST_ERROR(562, false, "管理员登录名已存在!"),
    40. ADMIN_NAME_NULL_ERROR(563, false, "管理员负责人不能为空!"),
    41. ADMIN_PASSWORD_ERROR(564, false, "密码不能为空或则两次输入不一致!"),
    42. ADMIN_CREATE_ERROR(565, false, "添加管理员失败!"),
    43. ADMIN_PASSWORD_NULL_ERROR(566, false, "密码不能为空!"),
    44. ADMIN_NOT_EXIT_ERROR(567, false, "管理员不存在或密码错误!"),
    45. ADMIN_FACE_NULL_ERROR(568, false, "人脸信息不能为空!"),
    46. ADMIN_FACE_LOGIN_ERROR(569, false, "人脸识别失败,请重试!"),
    47. CATEGORY_EXIST_ERROR(570, false, "文章分类已存在,请换一个分类名!"),
    48. // 媒体中心 相关错误 58x
    49. ARTICLE_COVER_NOT_EXIST_ERROR(580, false, "文章封面不存在,请选择一个!"),
    50. ARTICLE_CATEGORY_NOT_EXIST_ERROR(581, false, "请选择正确的文章领域!"),
    51. ARTICLE_CREATE_ERROR(582, false, "创建文章失败,请重试或联系管理员!"),
    52. ARTICLE_QUERY_PARAMS_ERROR(583, false, "文章列表查询参数错误!"),
    53. ARTICLE_DELETE_ERROR(584, false, "文章删除失败!"),
    54. ARTICLE_WITHDRAW_ERROR(585, false, "文章撤回失败!"),
    55. ARTICLE_REVIEW_ERROR(585, false, "文章审核出错!"),
    56. ARTICLE_ALREADY_READ_ERROR(586, false, "文章重复阅读!"),
    57. // 人脸识别错误代码
    58. FACE_VERIFY_TYPE_ERROR(600, false, "人脸比对验证类型不正确!"),
    59. FACE_VERIFY_LOGIN_ERROR(601, false, "人脸登录失败!"),
    60. // 系统错误,未预期的错误 555
    61. SYSTEM_ERROR(555, false, "系统繁忙,请稍后再试!"),
    62. SYSTEM_OPERATION_ERROR(556, false, "操作失败,请重试或联系管理员"),
    63. SYSTEM_RESPONSE_NO_INFO(557, false, "");
    64. // 响应业务状态
    65. private Integer status;
    66. // 调用是否成功
    67. private Boolean success;
    68. // 响应消息,可以为成功或者失败的消息
    69. private String msg;
    70. ResponseStatusEnum(Integer status, Boolean success, String msg) {
    71. this.status = status;
    72. this.success = success;
    73. this.msg = msg;
    74. }
    75. public Integer status() {
    76. return status;
    77. }
    78. public Boolean success() {
    79. return success;
    80. }
    81. public String msg() {
    82. return msg;
    83. }
    84. }

    说明:

    (1)有关枚举类的内容,可以参考【Spring Boot电商项目13:用户模块二:枚举类;(和【枚举数据类型】相比,【枚举类】可以管理一些复杂数据)】 ;枚举类数据类型、枚举类都还好,很容易理解;

    GraceJSONResult类:

    1. package com.imooc.grace.result;
    2. import java.util.Map;
    3. /**
    4. * 自定义响应数据类型枚举升级版本
    5. *
    6. * @Title: IMOOCJSONResult.java
    7. * @Package com.imooc.utils
    8. * @Description: 自定义响应数据结构
    9. * 本类可提供给 H5/ios/安卓/公众号/小程序 使用
    10. * 前端接受此类数据(json object)后,可自行根据业务去实现相关功能
    11. *
    12. * @Copyright: Copyright (c) 2020
    13. * @Company: www.imooc.com
    14. * @author 慕课网 - 风间影月
    15. * @version V2.0
    16. */
    17. public class GraceJSONResult {
    18. // 响应业务状态码
    19. private Integer status;
    20. // 响应消息
    21. private String msg;
    22. // 是否成功
    23. private Boolean success;
    24. // 响应数据,可以是Object,也可以是List或Map等
    25. private Object data;
    26. /**
    27. * 成功返回,带有数据的,直接往OK方法丢data数据即可
    28. * @param data
    29. * @return
    30. */
    31. public static GraceJSONResult ok(Object data) {
    32. return new GraceJSONResult(data);
    33. }
    34. /**
    35. * 成功返回,不带有数据的,直接调用ok方法,data无须传入(其实就是null)
    36. * @return
    37. */
    38. public static GraceJSONResult ok() {
    39. return new GraceJSONResult(ResponseStatusEnum.SUCCESS);
    40. }
    41. /**
    42. * 单参构造;操作成功,且有返回数据时,可以通过这个构造函数得到对应的GraceJSONResult对象。
    43. */
    44. public GraceJSONResult(Object data) {
    45. this.status = ResponseStatusEnum.SUCCESS.status();
    46. this.msg = ResponseStatusEnum.SUCCESS.msg();
    47. this.success = ResponseStatusEnum.SUCCESS.success();
    48. this.data = data;
    49. }
    50. /**
    51. * 对于【某些错误】并且【没有data数据】的情况(使用默认的500错误),可以调用这个方法,来获取对应的GraceJSONResult对象;
    52. * (错误返回,直接调用error方法即可,当然也可以在ResponseStatusEnum中自定义错误后再返回也都可以)
    53. * @return
    54. */
    55. public static GraceJSONResult error() {
    56. return new GraceJSONResult(ResponseStatusEnum.FAILED);
    57. }
    58. /**
    59. * 对于【某些错误】并且【有data数据】的情况(使用默认的500错误),可以调用这个方法,来获取对应的GraceJSONResult对象;
    60. * (错误返回,map中包含了多条错误信息,可以用于表单验证,把错误统一的全部返回出去)
    61. */
    62. public static GraceJSONResult errorMap(Map map) {
    63. return new GraceJSONResult(ResponseStatusEnum.FAILED, map);
    64. }
    65. /**
    66. * 对于【某些错误】并且【有msg】的情况(使用默认的500错误),可以调用这个方法,来获取对应的GraceJSONResult对象;
    67. * (错误返回,直接返回错误的消息)
    68. */
    69. public static GraceJSONResult errorMsg(String msg) {
    70. return new GraceJSONResult(ResponseStatusEnum.FAILED, msg);
    71. }
    72. /**
    73. * 对于【登录信息失效】并且【没有data数据】的情况,可以调用这个方法,来获取对应的GraceJSONResult对象;
    74. * (错误返回,token异常,一些通用的可以在这里统一定义)
    75. */
    76. public static GraceJSONResult errorTicket() {
    77. return new GraceJSONResult(ResponseStatusEnum.TICKET_INVALID);
    78. }
    79. /**
    80. * 一个通用的,在【出现错误】并且【没有data数据】时,获取对应的GraceJSONResult对象的方法;
    81. * 这个,主要是针对error的那种错误;
    82. * (自定义错误范围,需要传入一个自定义的枚举,可以到[ResponseStatusEnum.java[中自定义后再传入)
    83. */
    84. public static GraceJSONResult errorCustom(ResponseStatusEnum responseStatus) {
    85. return new GraceJSONResult(responseStatus);
    86. }
    87. /**
    88. * 一个通用的,在【出现错误】并且【没有data数据】时,获取对应的GraceJSONResult对象的方法;
    89. * 这个主要是针对exception异常的,那种错误;
    90. */
    91. public static GraceJSONResult exception(ResponseStatusEnum responseStatus) {
    92. return new GraceJSONResult(responseStatus);
    93. }
    94. /**
    95. * 单参构造:没有data;
    96. */
    97. public GraceJSONResult(ResponseStatusEnum responseStatus) {
    98. this.status = responseStatus.status();
    99. this.msg = responseStatus.msg();
    100. this.success = responseStatus.success();
    101. }
    102. /**
    103. * 双参构造:有data;
    104. */
    105. public GraceJSONResult(ResponseStatusEnum responseStatus, Object data) {
    106. this.status = responseStatus.status();
    107. this.msg = responseStatus.msg();
    108. this.success = responseStatus.success();
    109. this.data = data;
    110. }
    111. /**
    112. * 双参构造:自定义msg;
    113. */
    114. public GraceJSONResult(ResponseStatusEnum responseStatus, String msg) {
    115. this.status = responseStatus.status();
    116. this.msg = msg;
    117. this.success = responseStatus.success();
    118. }
    119. public GraceJSONResult() {
    120. }
    121. public Integer getStatus() {
    122. return status;
    123. }
    124. public void setStatus(Integer status) {
    125. this.status = status;
    126. }
    127. public String getMsg() {
    128. return msg;
    129. }
    130. public void setMsg(String msg) {
    131. this.msg = msg;
    132. }
    133. public Object getData() {
    134. return data;
    135. }
    136. public void setData(Object data) {
    137. this.data = data;
    138. }
    139. public Boolean getSuccess() {
    140. return success;
    141. }
    142. public void setSuccess(Boolean success) {
    143. this.success = success;
    144. }
    145. }

    说明:

    (1)PS:这个类中的方法,排版稍微有点小乱;而且,方法的职能的划分和规划,方法的类别有点小乱;;;;在实际中,自我感觉不太建议参考这儿的方法排版和规划方式,而是应该参考【Spring Boot电商项目14:用户模块三:API统一返回对象;(其中,涉及了【使用枚举类,来管理接口请求失败时,将要向前端返回的(状态码)和(错误信息)】;)】中的内容;

    (2)这类很容易理解,看注释;

    (3)在实际工作中,一般的套路就是:在业务代码中,遇到错误时,会使用枚举类相应的错误,去快速构建API统一返回对象;

    实测;

  • 相关阅读:
    Optuna:带仪表盘的可视化的超参数优化
    基于功能安全的车载计算平台开发:系统层面
    Android中fastboot devices无法发现设备解决方案和adb remount问题解决
    贪心算法练习day.4
    腾讯云centos7.6安装jdk
    124. 二叉树中的最大路径和
    Raspberry Pi 3 Model B+ (树莓派3B+)快速上手
    AI爆文变现脚本:0基础小白的保姆级操作教程-更新迭代
    合宙Air724UG LuatOS-Air LVGL API控件-标签 (Label)
    Win10使用nginx,注册到服务设置自启与后台运行,解决 Access is denied 问题
  • 原文地址:https://blog.csdn.net/csucsgoat/article/details/125401879