2024年1月Java项目开发指南8:统一数据返回格式
有时候返回一个字符串,有时候返回一串数字代码,有时候返回一个对象……
不过怎么说,我们返回的内容往往具有三个
1.消息代码 code
2.消息内容 msg
3.数据内容 data
接下来,我们要编写一个类,通过这个类,实现对所有返回内容进行格式化。
先去添加个依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<scope>provided</scope>
</dependency>

然后创建一个类 ResponseEntity.java

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("用户删除成功");
}
}
这时候我们再去测试,你就可以看到
格式统一了



2024年1月Java项目开发指南8:统一数据返回格式的更多相关文章
- 转:Java项目开发规范参考
Java项目开发规范参考 - KevinLee的博客 - 博客频道 - CSDN.NEThttp://blog.csdn.net/u011383131/article/details/51227860 ...
- IDEA 学习笔记之 Java项目开发深入学习(2)
Java项目开发深入学习(2): 查找变量被用到的地方 编译当前文件 增加变量watch 注意:我使用了keymap (eclipse模板),所以很多快捷键和eclipse一样. F5单步调试进入函数 ...
- IDEA 学习笔记之 Java项目开发深入学习(1)
Java项目开发深入学习(1): 定义编译输出路径: 继承以上工程配置 重新定义新的项目编译路径 添加source目录:点击添加,再点击移除: 编译项目: 常用快捷键总结: Ctrl+Space 代码 ...
- IDEA 学习笔记之 Java项目开发
Java项目开发: 新建模块: 添加JDK: 导入本地Jars: 从远程Maven仓库下载: 创建package: 新建类/接口/枚举等: 字体太小,改字体: Duplicate Scheme 修改编 ...
- 《Maven在Java项目开发中的应用》论文笔记(十七)
标题:Maven在Java项目开发中的应用 一.基本信息 时间:2019 来源:山西农业大学 关键词:Maven:Java Web:仓库:开发人员:极限编程; 二.研究内容 1.Maven 基本原理概 ...
- 收藏基本Java项目开发的书
一.Java项目开发全程实录 第1章 进销存管理系统(Swing+SQL Server2000实现) 第2章企业内部通信系统(Swing+JavaDB实现) 第3章 企业人事管理系统( Swing+H ...
- Java项目开发中实现分页的三种方式一篇包会
前言 Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...
- SPA项目开发之动态树+数据表格+分页
SPA项目开发之动态树+数据表格+分页 动态生成NavMenu导航菜单(只支持2级菜单) <el-menu key="" index=""> < ...
- 基于.NetCore开发博客项目 StarBlog - (24) 统一接口数据返回格式
前言 开发接口,是给客户端(Web前端.App)用的,前面说的RESTFul,是接口的规范,有了统一的接口风格,客户端开发人员在访问后端功能的时候能更快找到需要的接口,能写出可维护性更高的代码. 而接 ...
- Java学习-013-文本文件读取实例源代码(两种数据返回格式)
此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 1.读取的文本文件内容以一维数组[LinkedList<String>]的形式返回,源代 ...
随机推荐
- WebAssembly C++开发环境搭建
WebAssembly 开发环境搭建 简介 WebAssembly 是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸 ...
- vue前端开发仿钉图系列(3)右侧画点线面的开发详解
项目开发是完全仿照钉图的功能,参照钉图的逻辑和高德地图的参考手册以及aip文档,一点点的把功能做出来并呈现最后的效果.选中画点,在地图上获取经纬度并进行反地理编码,添加marker并弹出右侧编辑页面, ...
- 在Vue3中如何实现四种全局状态数据的统一管理?
四种全局状态数据 在实际开发当中,会遇到四种全局状态数据:异步数据(一般来自服务端).同步数据.同步数据又分为三种:localstorage.cookie.内存.在传统的 Vue3 当中,分别采用不同 ...
- 如何理解 .Net 中的 委托
// 委托 // 一种方法的声明和定义,也就是方法的占位符 // 一般使用在 参数 和 属性中 int Add(int a,int b) { return a + b; } // 定义委托的三种方法 ...
- Android复习(六)核心组件—>Activity 任何和返回栈、进程和应用生命周期、Parcelable和Bundle
了解任务和返回堆栈 任务是用户在执行某项工作时与之互动的一系列 Activity 的集合.这些 Activity 按照每个 Activity 打开的顺序排列在一个返回堆栈中.例如,电子邮件应用可能有一 ...
- day02-json字符串和js对象
Web1.0时代 早期网站的登录,如果失败,需要刷新页面才能重新登录; 如果不点击提交按钮,就不知道自己密码输错了: 现在大多数的网站,都是局部刷新,在不刷新整个页面的情况下,实现页面更新: 注册的时 ...
- 云原生爱好者周刊:使用 GitOps 来动态管理 Grafana 的数据源
文章推荐 使用 GitOps 来动态管理 Grafana 的数据源 通过 Grafana 的 Provisioning 特性,可以在 provisioning/datasources 目录下添加多个 ...
- HDFS 重要机制之 checkpoint
核心概念 hdfs checkpoint 机制对于 namenode 元数据的保护至关重要, 是否正常完成检查点是评估 hdfs 集群健康度和风险的重要指标 editslog : 对 hdfs 操作的 ...
- Redisson 工作原理-源码分析
时间不在于你拥有多少,而在于你怎样使用. 1:Redisson 是什么 个人理解:一种 可重入.持续阻塞.独占式的 分布式锁协调框架,可从 ReentrantLock 去看它. ①:可重入锁 拿到锁的 ...
- 顶点着色网格转换为 UV 映射的纹理化网格
简介 顶点着色是一种将颜色信息直接应用于网格顶点的简便方法.这种方式常用于生成式 3D 模型的构建,例如 InstantMesh.然而,大多数应用程序更偏好使用 UV 映射的纹理化网格. 本教程将介绍 ...