当前位置:   article > 正文

springboot 404_spring Boot手把手教学(8): 封装统一返回实体类

logback unparseable

da9fd613cb47814c8adc7e7ab32b89ed.png
  • 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
  1. package com.scaffold.test.base;
  2. import lombok.Data;
  3. /**
  4. * 统一API响应结果封装
  5. */
  6. @Data
  7. public class Result {
  8. private int code;
  9. private String message = "success";
  10. private Object data;
  11. // 后面result生成器需要以下方法
  12. public Result setCode(ResultCode resultCode){
  13. this.code = resultCode.code;
  14. return this;
  15. }
  16. public Result setMessage(String message){
  17. this.message = message;
  18. return this;
  19. }
  20. public Result setData(Object data){
  21. this.data = data;
  22. return this;
  23. }
  24. }

这里我们是用 lombok, @Data 注解,简化了实体类的GetterSetter

  1. <!-- lombok 简化代码-->
  2. <dependency>
  3. <groupId>org.projectlombok</groupId>
  4. <artifactId>lombok</artifactId>
  5. <optional>true</optional>
  6. </dependency>

在实际项目中:

一般 Response 包含三个 KEY : code、message 和 data,固定的数据结构约定,方便和其他同事联调测试。

833e88aa966b6157b372894943006d1c.png
1. code

HTTP状态码(500 Server Error, 404 Not Fund 等等 1XX,2XX,3XX,4XX,5XX的各类错误 )
也有业务系统自定义的一些非标准状态码比如000000,999999,比较乱,建议还是以标准为好;

HTTP 状态码大全
  1. 1 消息
  2. 100 Continue
  3. 101 Switching Protocols
  4. 102 Processing
  5. 2 成功
  6. 200 OK
  7. 201 Created
  8. 202 Accepted
  9. 203 Non-Authoritative Information
  10. 204 No Content
  11. 205 Reset Content
  12. 206 Partial Content
  13. 207 Multi-Status
  14. 3 重定向
  15. 300 Multiple Choices
  16. 301 Moved Permanently
  17. 302 Move Temporarily
  18. 303 See Other
  19. 304 Not Modified
  20. 305 Use Proxy
  21. 306 Switch Proxy
  22. 307 Temporary Redirect
  23. 4 请求错误
  24. 400 Bad Request
  25. 401 Unauthorized
  26. 402 Payment Required
  27. 403 Forbidden
  28. 404 Not Found
  29. 405 Method Not Allowed
  30. 406 Not Acceptable
  31. 407 Proxy Authentication Required
  32. 408 Request Timeout
  33. 409 Conflict
  34. 410 Gone
  35. 411 Length Required
  36. 412 Precondition Failed
  37. 413 Request Entity Too Large
  38. 414 Request-URI Too Long
  39. 415 Unsupported Media Type
  40. 416 Requested Range Not Satisfiable
  41. 417 Expectation Failed
  42. 418 I'm a teapot
  43. ▪ 421 Misdirected Request
  44. ▪ 422 Unprocessable Entity
  45. ▪ 423 Locked
  46. ▪ 424 Failed Dependency
  47. ▪ 425 Too Early
  48. ▪ 426 Upgrade Required
  49. ▪ 449 Retry With
  50. ▪ 451 Unavailable For Legal Reasons
  51. 5 服务器错误
  52. ▪ 500 Internal Server Error
  53. ▪ 501 Not Implemented
  54. ▪ 502 Bad Gateway
  55. ▪ 503 Service Unavailable
  56. ▪ 504 Gateway Timeout
  57. ▪ 505 HTTP Version Not Supported
  58. ▪ 506 Variant Also Negotiates
  59. ▪ 507 Insufficient Storage
  60. ▪ 509 Bandwidth Limit Exceeded
  61. ▪ 510 Not Extended
  62. ▪ 600 Unparseable Response Headers
2. data

❝ data 返回的就是我们所需的数据,无论是 List 还是 Map, 都在这里返回;
  1. // 查询所有
  2. @GetMapping("/list")
  3. public Result getList() {
  4. Result result;
  5. List<Job> jobList = jobService.findAll();
  6. result = ResultGenerator.getSuccessResult(jobList);
  7. return result;
  8. }

78f2abd15d48db75a4047570a3583dfb.png
3. message

❝ message 返回的就是提示语,以便于作出友好提示

3、自定义响应码枚举

❝ com.scaffold.test.base.ResultCode
  1. package com.scaffold.test.base;
  2. /**
  3. * 响应码枚举,参考HTTP状态码的语义
  4. */
  5. public enum ResultCode {
  6. SUCCESS(200),//成功
  7. FAIL(400),//失败
  8. UNAUTHORIZED(401),//未认证(签名错误)
  9. NOT_FOUND(404),//接口不存在
  10. INTERNAL_SERVER_ERROR(500);//服务器内部错误
  11. public int code;
  12. ResultCode(int code) {
  13. this.code = code;
  14. }
  15. }

4、响应结果生成类

  1. package com.scaffold.test.base;
  2. /**
  3. * 响应结果生成工具
  4. */
  5. public class ResultGenerator {
  6. private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
  7. // 只返回状态
  8. public static Result getSuccessResult() {
  9. return new Result()
  10. .setCode(ResultCode.SUCCESS)
  11. .setMessage(DEFAULT_SUCCESS_MESSAGE);
  12. }
  13. // 成功返回数据
  14. public static Result getSuccessResult(Object data) {
  15. return new Result()
  16. .setCode(ResultCode.SUCCESS)
  17. .setMessage(DEFAULT_SUCCESS_MESSAGE)
  18. .setData(data);
  19. }
  20. // 失败
  21. public static Result getFailResult(String message) {
  22. return new Result()
  23. .setCode(ResultCode.FAIL)
  24. .setMessage(message);
  25. }
  26. }

这里有三种状态的方法,大抵是够用了;

❝ 第一种,是无需返回data, 比如只查询状态
  1. // 无需data
  2. @GetMapping("/status")
  3. public Result status() {
  4. // 模拟无需data
  5. return ResultGenerator.getSuccessResult();
  6. }

ec7b280230c13cdb69bd28616f6ee84e.png
❝ 第二种是,请求获取数据成功
  1. // 查询所有
  2. @GetMapping("/list")
  3. public Result getList() {
  4. Result result;
  5. List<Job> jobList = jobService.findAll();
  6. result = ResultGenerator.getSuccessResult(jobList);
  7. return result;
  8. }

cb5b757448d9a235777f4b829b4e3adb.png
❝ 第三种是,请求获取失败信息
  1. // 错误
  2. @GetMapping("/err")
  3. public Result err() {
  4. // 模拟错误
  5. return ResultGenerator.getFailResult("模拟错误");
  6. }

df70c0bdf9ef196867a2eb8ab09ea72c.png

5、完整代码

❝ com.scaffold.test.base.Result: 统一API响应结果封装
  1. package com.scaffold.test.base;
  2. import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  3. import lombok.Data;
  4. /**
  5. * 统一API响应结果封装
  6. */
  7. @Data
  8. // 非空返回
  9. @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
  10. public class Result {
  11. private int code;
  12. private String message = "success";
  13. private Object data;
  14. public Result setCode(ResultCode resultCode){
  15. this.code = resultCode.code;
  16. return this;
  17. }
  18. public Result setMessage(String message){
  19. this.message = message;
  20. return this;
  21. }
  22. public Result setData(Object data){
  23. this.data = data;
  24. return this;
  25. }
  26. }
❝ com.scaffold.test.base.ResultCode: 响应码枚举
  1. package com.scaffold.test.base;
  2. /**
  3. * 响应码枚举,参考HTTP状态码的语义
  4. */
  5. public enum ResultCode {
  6. SUCCESS(200),//成功
  7. FAIL(400),//失败
  8. UNAUTHORIZED(401),//未认证(签名错误)
  9. NOT_FOUND(404),//接口不存在
  10. INTERNAL_SERVER_ERROR(500);//服务器内部错误
  11. public int code;
  12. ResultCode(int code) {
  13. this.code = code;
  14. }
  15. }
❝ com.scaffold.test.base.ResultGenerator
  1. package com.scaffold.test.base;
  2. /**
  3. * 响应结果生成工具
  4. */
  5. public class ResultGenerator {
  6. private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
  7. // 只返回状态
  8. public static Result getSuccessResult() {
  9. return new Result()
  10. .setCode(ResultCode.SUCCESS)
  11. .setMessage(DEFAULT_SUCCESS_MESSAGE);
  12. }
  13. // 成功返回数据
  14. public static Result getSuccessResult(Object data) {
  15. return new Result()
  16. .setCode(ResultCode.SUCCESS)
  17. .setMessage(DEFAULT_SUCCESS_MESSAGE)
  18. .setData(data);
  19. }
  20. // 失败
  21. public static Result getFailResult(String message) {
  22. return new Result()
  23. .setCode(ResultCode.FAIL)
  24. .setMessage(message);
  25. }
  26. }
❝ com.scaffold.test.controller.JobController
  1. package com.scaffold.test.controller;
  2. import com.scaffold.test.base.Result;
  3. import com.scaffold.test.base.ResultGenerator;
  4. import com.scaffold.test.base.ServiceException;
  5. import com.scaffold.test.entity.Job;
  6. import com.scaffold.test.service.JobService;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.web.bind.annotation.*;
  9. import java.util.List;
  10. /**
  11. * <p>
  12. * 前端控制器
  13. * </p>
  14. *
  15. * @author alex wong
  16. * @since 2020-06-14
  17. */
  18. @RestController
  19. @RequestMapping("/job")
  20. public class JobController {
  21. @Autowired
  22. private JobService jobService;
  23. // 查询所有
  24. @GetMapping("/list")
  25. public Result getList() {
  26. Result result;
  27. List<Job> jobList = jobService.findAll();
  28. result = ResultGenerator.getSuccessResult(jobList);
  29. return result;
  30. }
  31. // 错误
  32. @GetMapping("/err")
  33. public Result err() {
  34. // 模拟错误
  35. return ResultGenerator.getFailResult("模拟错误");
  36. }
  37. // 无需data
  38. @GetMapping("/status")
  39. public Result status() {
  40. // 模拟无需data
  41. return ResultGenerator.getSuccessResult();
  42. }
  43. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/222395
推荐阅读
相关标签
  

闽ICP备14008679号