首页 > 编程语言 >2024年1月Java项目开发指南8:统一数据返回格式

2024年1月Java项目开发指南8:统一数据返回格式

时间:2024-01-25 18:47:56浏览次数:29  
标签:指南 code Java 2024 ResponseEntity msg import data public

有时候返回一个字符串,有时候返回一串数字代码,有时候返回一个对象……

不过怎么说,我们返回的内容往往具有三个
1.消息代码 code
2.消息内容 msg
3.数据内容 data

接下来,我们要编写一个类,通过这个类,实现对所有返回内容进行格式化。

先去添加个依赖

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.28</version>
			<scope>provided</scope>
		</dependency>

image

然后创建一个类 ResponseEntity.java

image

package cc.xrilang.serversystem.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ResponseEntity {
}

在上面的代码中,我们使用了Lombok库来简化getter、setter和构造方法的编写。确保在项目的pom.xml文件中添加了Lombok的依赖.

很好,下面的写法涉及很多知识点

package cc.xrilang.serversystem.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ResponseEntity<T> {
    private Integer code; // 消息代码,不填写默认1
    private String msg;   // 消息内容,不填写默认"success"
    private T data;       // 数据内容,可以为空
    public static <T> ResponseEntity<T> success(T data) {
        return success(data, "success");
    }

    public static <T> ResponseEntity<T> success(T data, String msg) {
        return ResponseEntity.<T>builder()
                .code(1)
                .msg(msg)
                .data(data)
                .build();
    }
    public static <T> ResponseEntity<T> error(String msg) {
        return ResponseEntity.<T>builder()
                .code(-1) //这里假设-1代表错误
                .msg(msg)
                .build();
    }
    public static <T> ResponseEntity<T> info(Integer code, String msg, T data) {
        return ResponseEntity.<T>builder()
                .code(code)
                .msg(msg)
                .data(data)
                .build();
    }

    public static <T> ResponseEntity<T> info(Integer code, T data) {
        return info(code, "info", data);
    }

    public static <T> ResponseEntity<T> info(Integer code) {
        return info(code, "info", null);
    }
    public static <T> ResponseEntity<T> info(Integer code,String msg) {
        return info(code, msg, null);
    }
}

这个 ResponseEntity 类的设计涉及了多个Java和面向对象编程的知识点。以下是一些关键的概念和特性:

泛型 (Generics):
ResponseEntity 使用了泛型,允许你在创建 ResponseEntity 对象时指定数据的类型。这使得 ResponseEntity 类更加灵活和可重用。

Lombok 库:

@Data: Lombok 注解,自动生成 getter、setter、equals、hashCode 和 toString 方法。
@Builder: 提供了构建器模式的实现,允许你以链式调用的方式创建对象。
@NoArgsConstructor 和 @AllArgsConstructor: 分别自动生成无参构造函数和全参构造函数。
面向对象的封装:
类的属性(code, msg, data)被设置为私有(private),并通过公共方法(由 Lombok 自动生成或通过其他方式提供)进行访问和修改。这确保了数据的安全性和完整性。

静态工厂方法 (Static Factory Methods):
success, error, 和 info 是静态工厂方法,用于创建特定类型的 ResponseEntity 对象。这些方法提供了一种更具描述性的方式来创建对象,而不是直接使用构造函数。

方法重载 (Overloading):
success, info 等方法有多个版本,每个版本接受不同数量和/或类型的参数。这是方法重载的一个例子,它允许你在同一个类中使用相同的方法名,但有不同的签名。

链式调用 (Chaining):
由于使用了 Lombok 的 @Builder 注解,你可以在创建对象时进行链式调用,如 .code(1).msg("success").data(data).build()。

消息传递模式:
ResponseEntity 似乎遵循了一种常见的消息传递或响应模式,这在构建 RESTful API 或其他需要结构化响应的系统中很常见。它包含了一个状态码(code)、一个消息(msg)和一些可选的数据(data)。

可读性和可维护性:
通过使用静态工厂方法和明确的命名,代码变得更加易于阅读和维护。例如,ResponseEntity.success(data) 比直接使用构造函数更清晰地表达了意图。

API 设计:
此类也涉及到良好的API设计原则,如提供一致的接口、使用有意义的命名、减少冗余等。

这个 ResponseEntity 类是一个很好的例子,展示了如何结合多个Java特性和设计原则来创建一个灵活、可重用、易于维护的类。

然后我们把这个类结合到我们之前写的Controller层去

package cc.xrilang.serversystem.controller;

import cc.xrilang.serversystem.domain.ResponseEntity;
import cc.xrilang.serversystem.domain.Users;
import cc.xrilang.serversystem.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.sql.Timestamp;
import java.util.List;

@RestController // 使用@RestController代替@Controller,这样就不需要每个方法都添加@ResponseBody
@RequestMapping("/users")
public class UsersController {

    @Autowired
    private UsersService usersService;

    // 读取用户列表
    @GetMapping
    public ResponseEntity<List<Users>> readAllUsers() {
        List<Users> users = usersService.readAllUsers();
        return ResponseEntity.success(users);
    }

    // 增加用户
    @PostMapping
    public ResponseEntity<?> createUser(@RequestBody Users user) {
        if (usersService.selectUserAccount(user.getUserAccount()) != null) {
            return ResponseEntity.error("该账号已注册");
        }

        user.setUserStatus(1);
        user.setUserRegTime(new Timestamp(System.currentTimeMillis()));
        Users createdUser = usersService.createUser(user);
        return ResponseEntity.success(createdUser);
    }

    // 读取单个用户
    @GetMapping("/{userId}")
    public ResponseEntity<Users> readUser(@PathVariable long userId) {
        Users user = usersService.readUser(userId);
        return user != null ? ResponseEntity.success(user) : ResponseEntity.error("用户不存在");
    }

    // 更新用户
    @PutMapping
    public ResponseEntity<Users> updateUser(@RequestBody Users user) {
        Users existingUser = usersService.readUser(user.getUserId());
        if (existingUser == null) {
            return ResponseEntity.error("用户不存在");
        }

        // 更新用户信息(此处代码保持不变)

        Users updatedUser = usersService.updateUser(existingUser);
        return ResponseEntity.success(updatedUser);
    }

    // 删除用户
    @DeleteMapping("/{userId}")
    public ResponseEntity<?> deleteUser(@PathVariable long userId) {
        usersService.deleteUser(userId);
        return ResponseEntity.success("用户删除成功");
    }
}

这时候我们再去测试,你就可以看到
格式统一了

image

image

image

标签:指南,code,Java,2024,ResponseEntity,msg,import,data,public
From: https://www.cnblogs.com/mllt/p/17987890/project202401-8

相关文章

  • THUWC & WC 2024 游记
    2024-01-25去重庆,要到宁波赶飞机,早上5:40起床,吃完早饭下楼等ZHY巨佬。ZHY巨佬昨天刚切了第六分块,还拿了个最优解(本来是rk2的,但rk1的用户被封禁了),准备在火车上颓题解。到宁波坐地铁到飞机场,在候机室看ZHY巨佬写题解。马上上飞机了FSB带着一堆初二巨佬过来(LYL,XY......
  • 笨办法学 Java(四)
    原文:LearnJavaTheHardWay译者:飞龙协议:CCBY-NC-SA4.0练习55:记录数组记录很棒,数组更好,但是当你把记录放入数组时,这个生活中几乎没有你不能编码的东西。1classStudent2{3Stringname;4intcredits;5doublegpa;6}78publicclass......
  • 洛谷题单指南-模拟和高精度-P1045 [NOIP2003 普及组] 麦森数
    原题链接:https://www.luogu.com.cn/problem/P1045题意解读:要计算2p-1的位数和最后500位,实际上只需要计算2p,两者位数一致,前者比后者个位减1即可,且个位肯定不会是0,比较容易处理。解题思路:如果直接采用高精度乘法计算2p,p最大3.1*106,高精度所用数组最长大概9*105,一共最多计算3.......
  • 2024年1月Java项目开发指南7:增删改查与接口测试
    我们之前,是从Controller层写到Service层,然后mapper层。接下来我们反过来,从mapper层写到Controller层两种方式都可以,你喜欢就行,甚至你先写service层也可以,全凭个人喜欢。在本文中,就不解释太多了,直接给出代码,对于关键地方,我会圈出来。如果有问题,可以直接在本文首发地址(博客园......
  • JAVA调用Python脚本执行
    SpringBoot-web环境<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>springboot--启动类@SpringBootApplication(ex......
  • java aspect 切面怎么获取 POST 数据
    javaaspect切面怎么获取POST数据/***切面*/@Aspect@ComponentpublicclassPostRequestBodyAspect{@Pointcut("execution(*com.example.controller.*.*(..))")publicvoidcontrollerMethods(){}......
  • html 中javascript 如何被调用
    在HTML中,JavaScript可以通过多种方式进行调用。1.内联脚本(InlineScript):直接将JavaScript代码写入到HTML文件的<script>标签中。示例代码如下所示:<!DOCTYPEhtml><html><head><title>使用内联脚本</title></head><body><!--HTML页面内容--><scripttyp......
  • JAVA学习笔记--使用Inte IDEA
    使用IntellijIDEA编写代码新建项目创建新项目选择创建一个空项目并输入项目名弹出ProjecStructure窗口先关闭新建一个模板(Module)并输入模板名打开前面关闭的ProjecStructure窗口修改以下信息(注意:安装的是JDK8则按照以下信息修改,若安装的是JDK其他版本则......
  • JAVA学习笔记--数据类型及注意事项
    Java的数据类型(笔试考题)Java是强类型语言:要求变量使用要严格符合规定,所有变量都必须先定义后才能使用基本类型(primitivetype)数据类型整数类型byte(1字节):-128~127short(2字节):-32768~32767int(4字节):-2147483648~2147483647(最常用)long(8字节):-9223372036854775808~922......
  • JAVA学习笔记--变量与常量
    变量局部变量注意:必须声明并且必须初始化值publicclassHello{//main方法publicstaticvoidmain(String[]args){//局部变量,只在{}内使用inti=10;System.out.print(i);}//其他方法publicvoidadd(){......