springboot封装响应实体

梦里梦外; 2024-03-17 14:08 78阅读 0赞

前言

首先什么是响应实体:

正常我们的后端都是接收前端,然后把请求需要的数据返回给前端,而这个返回的数据就是我们的响应实体

那么,为什么我们需要进行封装响应实体呢?

第一点,最明显的就是,为了人机友好交互,如果单单只是把返回的数据给到前端,
有数据还好,但是没有数据的情况下,前端用户使用的时候查不到数据,
怎么知道是因为什么原因没有数据呢?是因为确实查不到数据,还是因为业务逻辑卡控查不到数据,或者说代码逻辑报错

第二点的话,是为了保证类型安全性:使用泛型可以在编译时期提供类型检查,在运行时避免类型错误。通过泛型封装响应体,可以确保返回的数据类型与期望的类型一致,减少由于类型不匹配而引发的错误。

第三点,API设计:使用泛型封装响应体可以提高API的友好性和一致性。通过统一的响应体封装,客户端可以更容易地理解和使用API,并且不需要对每个响应类型进行专门处理。
在大部分的对外程序里,你如果要使用别人写的程序,调用对方的某个功能,都是看对方的API接口,看返回和请求的数据分别是什么

第四点,可复用性以及扩展性:使用泛型封装响应体可以将通用的逻辑和行为与具体的响应类型解耦,使其可以在不同的场景中复用。这种灵活性可以减少代码的重复编写,提高代码的可维护性和可扩展性。泛型封装响应体可以为不同类型的响应提供支持,而无需修改现有的代码。这种灵活性使得我们可以轻松添加新的响应类型,提供更多的选择和功能

泛型

在上面,我有反复提到泛型,那么什么是泛型?

在Java语言中,泛型是一种强类型机制,它允许在定义类、接口和方法时使用参数化类型。通过使用泛型,可以实现类型的参数化,在编译时进行类型检查,提高代码的安全性和可维护性。

说了这么多有一些空泛,那么这边给出具体的实例作为演示

这里编写了一个泛型

  1. public class Box<T> {
  2. private T value;
  3. public Box(T value) {
  4. this.value = value;
  5. }
  6. public T getValue() {
  7. return value;
  8. }
  9. public void setValue(T value) {
  10. this.value = value;
  11. }
  12. }

使用

  1. public class GenericExample {
  2. public static void main(String[] args) {
  3. // 创建一个存储整数的Box对象
  4. Box<Integer> intBox = new Box<>(10);
  5. intBox.setValue(20); // 设置新的值
  6. int value = intBox.getValue(); // 取得值
  7. // 创建一个存储字符串的Box对象
  8. Box<String> stringBox = new Box<>("Hello");
  9. stringBox.setValue("World"); // 设置新的值
  10. String str = stringBox.getValue(); // 取得值
  11. }
  12. }

在上述中,我们不管是使用Integer还是String类型去存储数据,都能够正常的执行
因此,泛型表现在:可接收任意的类型的数据

基础封装响应实体

以下为响应实体的代码:

  1. public class Response<T> {
  2. // 状态码
  3. private int statusCode;
  4. // 响应信息提示
  5. private String message;
  6. // 响应数据
  7. private T data;
  8. // 构造函数
  9. public Response(int statusCode, String message, T data) {
  10. this.statusCode = statusCode;
  11. this.message = message;
  12. this.data = data;
  13. }
  14. // Getter和Setter方法
  15. // 状态码
  16. public int getStatusCode() {
  17. return statusCode;
  18. }
  19. public void setStatusCode(int statusCode) {
  20. this.statusCode = statusCode;
  21. }
  22. // 响应信息提示
  23. public String getMessage() {
  24. return message;
  25. }
  26. public void setMessage(String message) {
  27. this.message = message;
  28. }
  29. // 响应数据
  30. public T getData() {
  31. return data;
  32. }
  33. public void setData(T data) {
  34. this.data = data;
  35. }
  36. }

使用

  1. public Response<String> Method1(String val) {
  2. // 执行逻辑,获取数据
  3. // 封装响应实体并返回
  4. return new Response<>(200, "成功", "响应数据");
  5. }

根据你对封装的响应实体的重载方法,可编写不同的返回值

如:

  1. return new Response<>("响应数据");
  2. return new Response<>(200, "成功", "响应数据");
  3. return new Response<>(200, "成功");

进阶封装响应

封装请求头和请求数据

如果你想封装为请求头和请求数据分离的形式,可编写代码如下:

  1. public class Response<T> {
  2. public Header header;
  3. public T value;
  4. public Response() {
  5. }
  6. public Response(T value) {
  7. this.header = new Header();
  8. this.value = value;
  9. }
  10. public Response(int code, Exception ex) {
  11. if (ex.getMessage() == null) {
  12. this.header = new Header(code, ex.toString());
  13. } else {
  14. this.header = new Header(code, ex.getMessage());
  15. }
  16. this.value = null;
  17. }
  18. public Response(int code, String message) {
  19. this.header = new Header(code, message);
  20. this.value = null;
  21. }
  22. public Response(int code, T value, Exception ex) {
  23. if (ex.getMessage() == null) {
  24. this.header = new Header(code, ex.toString());
  25. } else {
  26. this.header = new Header(code, ex.getMessage());
  27. }
  28. this.value = value;
  29. }
  30. public Response(int code, T value, String message) {
  31. this.header = new Header(code, message);
  32. this.value = value;
  33. }
  34. // 请求头,包含响应码和响应提醒信息
  35. public static class Header {
  36. public int code;
  37. public String message;
  38. public Header() {
  39. this.code = 0;
  40. this.message = "";
  41. }
  42. public Header(int code, String message) {
  43. this.code = code;
  44. this.message = message;
  45. }
  46. }
  47. }

自定义响应码

有的时候,你不想使用默认的响应码对应的响应数据,需要根据自己的项目自定义响应码。可参考如下

定义枚举类

  1. // 该注解需要添加lombok
  2. @Getter
  3. public enum ResultCode {
  4. SUCCESS(1000, "操作成功"),
  5. FAILED(1001, "响应失败"),
  6. VALIDATE_FAILED(1002, "参数校验失败"),
  7. NO_RESULT(1003, "未查询到相关信息"),
  8. MES_ERROR(1004, "未查询到相关信息"),
  9. ERROR(5000, "未知错误"),
  10. FILE_UPLOAD_ERROR(5001, "文件上传失败");
  11. private int code;
  12. private String msg;
  13. ResultCode(int code, String msg) {
  14. this.code = code;
  15. this.msg = msg;
  16. }
  17. }

响应体

  1. @Getter
  2. // 这两个注解可自动添加构造函数
  3. @AllArgsConstructor
  4. @NoArgsConstructor
  5. public class Response<T> {
  6. // 响应码
  7. private int code;
  8. // 响应提示信息
  9. private String msg;
  10. // 响应数据
  11. private T data;
  12. public Response(T data) {
  13. this(ResultCode.SUCCESS, data);
  14. }
  15. public Response(Integer code, String msg, T data) {
  16. this.code = code;
  17. this.msg = msg;
  18. this.data = data;
  19. }
  20. public Response(ResultCode resultCode, T data) {
  21. this.code = resultCode.getCode();
  22. this.msg = resultCode.getMsg();
  23. this.data = data;
  24. }
  25. }

使用

  1. public ResultVO Method1(){
  2. // 执行逻辑
  3. return new ResultVO(ResultCode.SUCCESS);
  4. }

使用对应的状态码,会返回封装的响应提示信息

结语

以上为springboot进行封装响应实体的代码

发表评论

表情:
评论列表 (有 0 条评论,78人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springboot封装响应实体

    前言 首先什么是响应实体: > 正常我们的后端都是接收前端,然后把请求需要的数据返回给前端,而这个返回的数据就是我们的响应实体 那么,为什么我们需要进行封装响应实体呢

    相关 DTO 实体封装json

    我们如果给页面返回的数据量有点繁琐 ,那么我们可以通过DTO 来封装json    在service层查询出来的数据直接用有参构造函数赋给Dto(实体类) 并进行实体类返回到控