spring Boot手把手教学(8): 封装统一返回实体类
- 1、前言
- 2、返回实体类
- 3、自定义响应码枚举
- 4、响应结果生成类
- 5、完整代码
1、前言
❝
前情回顾:
❞
Spring Boot手把手教学(1):如何生成优美的开篇banner.txt
Spring Boot手把手教学(2):使用yml多环境配置和创建多环境profile打包
Spring Boot手把手教学(3):从零配置logback日志
spring Boot手把手教学(4): mybatis-plus 代码生成器,自动帮你生成代码
spring Boot手把手教学(5): 定时任务
spring Boot手把手教学(6):发送邮件
spring Boot手把手教学(7): 抛弃try-catch, 如何优雅统一处理异常(包含404处理)
目前为止,已经写了七篇关于 Spring boot 的文章,大多是都一些基础配置服务,工欲善其事,必先利其器。
在实际项目中,很多同事,总是忽略基础项目建设,觉得基础项目建设不重要,没有写业务代码重要。
个人觉得,基础服务也是很重要的,这是个人整体从上而下的知识积累,业务代码CRUD,写完也没有多大的能力提升,贵在总结吧。
文章写得或许有些许粗糙,望来往同学,切莫在意,不喜勿喷哈哈,欢迎多多指导。
废话不多说,
返回实体类的封装,今天就简单的介绍一下吧。
2、返回实体类
❝
统一API响应结果封装:com.scaffold.test.base.Result
❞
package com.scaffold.test.base;import lombok.Data;/** * 统一API响应结果封装 */ @Data public class Result { private int code; private String message = "success"; private Object data; // 后面result生成器需要以下方法 public Result setCode(ResultCode resultCode){ this.code = resultCode.code; return this; } public Result setMessage(String message){ this.message = message; return this; } public Result setData(Object data){ this.data = data; return this; } }
这里我们是用 lombok
, @Data
注解,简化了实体类的Getter
和Setter
;
<!-- lombok 简化代码-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
在实际项目中:
一般 Response
包含三个 KEY : code、message 和 data
,固定的数据结构约定,方便和其他同事联调测试。
❝
1. code
❞
❝
HTTP状态码(500 Server Error, 404 Not Fund 等等 1XX,2XX,3XX,4XX,5XX的各类错误 )
也有业务系统自定义的一些非标准状态码比如000000,999999,比较乱,建议还是以标准为好;
❞
❝
HTTP 状态码大全
:❞
1 消息
▪ 100 Continue
▪ 101 Switching Protocols
▪ 102 Processing
2 成功
▪ 200 OK
▪ 201 Created
▪ 202 Accepted
▪ 203 Non-Authoritative Information
▪ 204 No Content
▪ 205 Reset Content
▪ 206 Partial Content
▪ 207 Multi-Status
3 重定向
▪ 300 Multiple Choices
▪ 301 Moved Permanently
▪ 302 Move Temporarily
▪ 303 See Other
▪ 304 Not Modified
▪ 305 Use Proxy
▪ 306 Switch Proxy
▪ 307 Temporary Redirect
4 请求错误
▪ 400 Bad Request
▪ 401 Unauthorized
▪ 402 Payment Required
▪ 403 Forbidden
▪ 404 Not Found
▪ 405 Method Not Allowed
▪ 406 Not Acceptable
▪ 407 Proxy Authentication Required
▪ 408 Request Timeout
▪ 409 Conflict
▪ 410 Gone
▪ 411 Length Required
▪ 412 Precondition Failed
▪ 413 Request Entity Too Large
▪ 414 Request-URI Too Long
▪ 415 Unsupported Media Type
▪ 416 Requested Range Not Satisfiable
▪ 417 Expectation Failed
▪ 418 I’m a teapot
▪ 421 Misdirected Request
▪ 422 Unprocessable Entity
▪ 423 Locked
▪ 424 Failed Dependency
▪ 425 Too Early
▪ 426 Upgrade Required
▪ 449 Retry With
▪ 451 Unavailable For Legal Reasons
5 服务器错误
▪ 500 Internal Server Error
▪ 501 Not Implemented
▪ 502 Bad Gateway
▪ 503 Service Unavailable
▪ 504 Gateway Timeout
▪ 505 HTTP Version Not Supported
▪ 506 Variant Also Negotiates
▪ 507 Insufficient Storage
▪ 509 Bandwidth Limit Exceeded
▪ 510 Not Extended
▪ 600 Unparseable Response Headers
❝
2. data
❞
❝
data 返回的就是我们所需的数据,无论是 List 还是 Map, 都在这里返回;
❞
// 查询所有
@GetMapping("/list")
public Result getList() {Result result;List<Job> jobList = jobService.findAll();result = ResultResponse.getSuccessResult(jobList); return result; }
❝
3. message
❞
❝
message 返回的就是提示语,以便于作出友好提示
❞
3、自定义响应码枚举
❝
com.scaffold.test.base.ResultCode
❞
package com.scaffold.test.base;/*** 响应码枚举,对应HTTP状态码*/public enum ResultCode { SUCCESS(200),//成功 FAIL(400),//失败 UNAUTHORIZED(401),//未认证(签名错误) NOT_FOUND(404),//接口不存在 INTERNAL_SERVER_ERROR(500);//服务器内部错误 public int code; ResultCode(int code) { this.code = code; } }
4、响应结果生成类
package com.scaffold.test.base;/*** 响应结果封装*/public class ResultResponse { private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS"; // 只返回状态 public static Result getSuccessResult() { return new Result() .setCode(ResultCode.SUCCESS) .setMessage(DEFAULT_SUCCESS_MESSAGE); } // 成功返回数据 public static Result getSuccessResult(Object data) { return new Result() .setCode(ResultCode.SUCCESS) .setMessage(DEFAULT_SUCCESS_MESSAGE) .setData(data); } // 失败 public static Result getFailResult(String message) { return new Result() .setCode(ResultCode.FAIL) .setMessage(message); } }
这里有三种状态的方法,大抵是够用了;
❝
第一种,是无需返回data, 比如只查询状态
❞
// 无需data
@GetMapping("/status")
public Result status() {// 模拟无需datareturn ResultResponse.getSuccessResult();
}
❝
第二种是,请求获取数据成功
❞
// 查询所有
@GetMapping("/list")
public Result getList() {Result result;List<Job> jobList = jobService.findAll();result = ResultResponse.getSuccessResult(jobList); return result; }
❝
第三种是,请求获取失败信息
❞
// 错误
@GetMapping("/err")
public Result err() {// 模拟错误return ResultResponse.getFailResult("模拟错误");
}
5、完整代码
❝
com.scaffold.test.base.Result: 统一API响应结果封装
❞
package com.scaffold.test.base;import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;/** * 统一API响应结果封装 */ @Data // 非空返回 @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Result { private int code; private String message = "success"; private Object data; public Result setCode(ResultCode resultCode){ this.code = resultCode.code; return this; } public Result setMessage(String message){ this.message = message; return this; } public Result setData(Object data){ this.data = data; return this; } }
❝
com.scaffold.test.base.ResultCode: 响应码枚举
❞
package com.scaffold.test.base;/*** 响应码枚举,参考HTTP状态码的语义*/public enum ResultCode { SUCCESS(200),//成功 FAIL(400),//失败 UNAUTHORIZED(401),//未认证(签名错误) NOT_FOUND(404),//接口不存在 INTERNAL_SERVER_ERROR(500);//服务器内部错误 public int code; ResultCode(int code) { this.code = code; } }
❝
com.scaffold.test.base.ResultResponse
❞
package com.scaffold.test.base;/*** 响应结果生成工具*/public class ResultResponse { private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS"; // 只返回状态 public static Result getSuccessResult() { return new Result() .setCode(ResultCode.SUCCESS) .setMessage(DEFAULT_SUCCESS_MESSAGE); } // 成功返回数据 public static Result getSuccessResult(Object data) { return new Result() .setCode(ResultCode.SUCCESS) .setMessage(DEFAULT_SUCCESS_MESSAGE) .setData(data); } // 失败 public static Result getFailResult(String message) { return new Result() .setCode(ResultCode.FAIL) .setMessage(message); } }
❝
com.scaffold.test.controller.JobController
❞
package com.scaffold.test.controller;import com.scaffold.test.base.Result;
import com.scaffold.test.base.ResultResponse;
import com.scaffold.test.base.ServiceException; import com.scaffold.test.entity.Job; import com.scaffold.test.service.JobService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * <p> * 前端控制器 * </p> * * @author alex wong * @since 2020-06-14 */ @RestController @RequestMapping("/job") public class JobController { @Autowired private JobService jobService; // 查询所有 @GetMapping("/list") public Result getList() { Result result; List<Job> jobList = jobService.findAll(); result = ResultResponse.getSuccessResult(jobList); return result; } // 错误 @GetMapping("/err") public Result err() { // 模拟错误 return ResultResponse.getFailResult("模拟错误"); } // 无需data @GetMapping("/status") public Result status() { // 模拟无需data return ResultResponse.getSuccessResult(); } }
本文使用 mdnice 排版
spring Boot手把手教学(8): 封装统一返回实体类相关推荐
- spring Boot手把手教学(6):发送邮件
文章目录 1.前言 2.安装依赖 3.添加配置信息 4.代码实现 5.功能扩展 5.1.发送HTML格式邮件 5.2.发送带附件的邮件 5.3.使用`thymeleaf`模板发送邮件 6.完整代码 1 ...
- spring -mvc 将对象封装json返回时删除掉对象中的属性注解方式
spring -mvc 将对象封装json返回时删除掉对象中的属性注解方式 在类名,接口头上注解使用在 @JsonIgnoreProperties(value={"comid" ...
- Spring Boot微服务间文件返回实现
Feign接口获取文件流问题_Java_wyazyf的博客-CSDN博客 https://blog.csdn.net/wyazyf/article/details/93200033 Spring Bo ...
- 兼容 Spring Boot 1.x 和 2.x 配置类参数绑定的工具类 SpringBootBindUtil
为了让我提供的通用 Mapper 的 boot-starter 同时兼容 Spring Boot 1.x 和 2.x,增加了这么一个工具类. 在 Spring Boot 中,能够直接注入 XXProp ...
- Spring Boot中使用AOP统一处理Web请求日志
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...
- Spring Boot笔记-404错误统一管理
这里有一点要注意: spring boot错误的页面都会到error的请求中,所以可以用如下的方式统一管理 package com.xxxxx.apc.controller;import com.ap ...
- spring boot 拦截器获取controller返回的数据_高级码农Spring Boot实战与进阶之过滤器和拦截器的使用及其区别...
众所周知的Spring Boot是很优秀的框架,它的出现简化了新Spring应用的初始搭建以及开发过程,大大减少了代码量,目前已被大多数企业认可和使用.这个专栏将对Spring Boot框架从浅入深, ...
- java封装统一返回结果工具类(CommonResultUtils)
1. 在common模块下创建子模块common_utils 2.common_utils 模块内定义返回状态码接口以及返回结果类 返回状态码: /*** 定义返回状态码*/ public inter ...
- Spring Boot中自带的这些工具类,你用过几个?
最近发现同事写了不少重复的工具类,发现其中很多功能,Spring 自带的都有.于是整理了本文,希望能够帮助到大家! 断言 断言是一个逻辑判断,用于检查不应该发生的情况 Assert 关键字在 JDK1 ...
- Spring Boot——基于spring-boot-starter-mail发送邮件的 Service 服务类DEMO
前言 发送邮件应该是网站的必备拓展功能之一,注册验证,忘记密码或者是给用户发送营销信息.正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在Spring Boot提供了一套集成spri ...
最新文章
- MySQL 学习笔记(2)— 通配符/正则表达/运算符
- ceres实现的pnp解算后的位姿优化代码详解
- Python实现微信防撤回
- iOS开发使用Unwind Segue进行返回
- XAF Study Recources
- .NET Core 3.0 可卸载程序集原理简析
- ZStack张鑫:面对混合云浪潮 我们主动出击
- Linux 金字塔 的shell命令,linux下保留文件系统下剩余指定数目文件的shell脚本
- Linux Mint 17 搭建 JSP 环境
- 实用素材|UI设计师需要的输入框和表单
- kickstart注意事项
- HDU-4035 Maze 概率DP
- 拓端tecdat|R语言数据可视化分析案例:探索BRFSS数据
- 如何反编译dll,并生成新的dll
- 【python量化】统计套利之配对交易策略实现(基于python)
- 取地址符和指针*的认识
- TypeScript 从零实现 axios 0x0
- kindle 越狱降级
- python拼多多领现金_拼多多天天领现金最后都是1分怎么办?
- MTK芯片处理器对比资料图
热门文章
- html图片有的不显示不出来的,css背景图片不显示有哪些原因?
- 手机配置host的替代方案
- [GPS]GPSGate x64下虚拟端口
- 幼儿园进行计算机培训心得体会,幼儿园教师课堂培训心得感悟五篇
- 【Python笔记】pyspark.sql.functions
- Server-sent events(SSE) EventSource 客户端使用与服务器基础实现(基于Node.js)
- GBS国标经纬度转高德经纬度
- 慢就是快的人生哲理_关于慢的境界的哲理美文
- TTML(IMSC)字幕
- ArcGIS无插件加载(无偏移)天地图