当前位置: 首页 > news >正文

SpringBoot开发——Spring Boot Controller 最佳实践

文章目录

  • 1、RESTful接口地址的定义规则
  • 2、设计通用控制器基类
  • 3、统一的返回对象设计
  • 4、统一的异常处理
  • 5、实际案例: 订单控制器 (OrderController)
  • 结论

随着微服务架构的普及,RESTful API已经成为现代Web服务的标准设计模式。Spring Boot为开发者提供了强大的工具来快速构建RESTful服务。本文将探讨如何利用Spring Boot的最佳实践来设计高效且一致的控制器。

1、RESTful接口地址的定义规则

RESTful API设计的核心在于资源的表述和操作的一致性。以下是一些基本的规则:

  • 资源表述:使用名词而不是动词表示资源,例如/orders不是/getOrder
  • 状态变更:使用HTTP方法来表达资源的状态变更,如POST用于创建资源,PUTPATCH用于更新资源,DELETE用于删除资源等。
    -URI一致性:保持URL路径的一致性和可预测性,例如/orders/{orderId}来获取特定订单的信息。
  • 状态码:正确使用HTTP状态码来传达请求的结果,如200 OK, 201 Created, 404 Not Found等。

示例
假设我们有一个订单管理的服务,我们可以这样设计API

  • GET /orders - 获取所有订单列表
  • GET /orders/{id} - 获取指定ID的订单信息
  • POST /orders - 创建新订单
  • PUT /orders/{id} - 更新指定ID的订单信息
  • DELETE /orders/{id} - 删除指定ID的订单

2、设计通用控制器基类

为了提高代码复用性和减少重复代码,可以设计一个通用的控制器基类,其他具体的控制器类可以继承它。通用控制器基类可以提供一些常用的方法,如返回成功响应、错误响应等。
示例代码

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
public class BaseController {protected <T> ResponseEntity<T> success(T data) {return ResponseEntity.ok().body(data);}protected ResponseEntity<?> error(String message) {return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message);}
}

3、统一的返回对象设计

为了保证API返回结果的一致性,可以定义一个统一的响应对象。这个对象通常包含一个状态码、消息和数据字段。

示例代码

public class ApiResponse<T> {private int code;private String message;private T data;public ApiResponse(int code, String message, T data) {this.code = code;this.message = message;this.data = data;}// Getter and Setter methods...
}

在控制器中使用:

public ResponseEntity<ApiResponse<Order>> getOrder(@PathVariable Long id) {Order order = orderService.getOrder(id);return ResponseEntity.ok(new ApiResponse<>(200, "Success", order));
}

4、统一的异常处理

通过集中处理异常,可以确保所有的异常都按照统一的方式处理并返回给客户端。这有助于保持API行为的一致性,并且可以提供更友好的错误信息。
示例代码

@ExceptionHandler(OrderNotFoundException.class)
public ResponseEntity<ApiResponse<String>> handleOrderNotFoundException(OrderNotFoundException e) {return ResponseEntity.ok(new ApiResponse<>(404, e.getMessage(), null));
}

5、实际案例: 订单控制器 (OrderController)

现在让我们来看一个具体的例子:订单控制器(OrderController)。这个控制器将继承BaseController,并使用我们之前定义的统一的返回对象和异常处理。
订单控制器代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/orders")
public class OrderController extends BaseController {private final OrderService orderService;@Autowiredpublic OrderController(OrderService orderService) {this.orderService = orderService;}@GetMapping("/{id}")public ResponseEntity<ApiResponse<Order>> getOrder(@PathVariable Long id) {Order order = orderService.getOrder(id);return success(new ApiResponse<>(200, "Success", order));}@PostMappingpublic ResponseEntity<ApiResponse<Order>> createOrder(@RequestBody OrderRequest orderRequest) {Order order = orderService.createOrder(orderRequest);return success(new ApiResponse<>(201, "Order created successfully", order));}@PutMapping("/{id}")public ResponseEntity<ApiResponse<Order>> updateOrder(@PathVariable Long id, @RequestBody OrderRequest orderRequest) {Order updatedOrder = orderService.updateOrder(id, orderRequest);return success(new ApiResponse<>(200, "Order updated successfully", updatedOrder));}@DeleteMapping("/{id}")public ResponseEntity<ApiResponse<Void>> deleteOrder(@PathVariable Long id) {orderService.deleteOrder(id);return success(new ApiResponse<>(204, "Order deleted successfully", null));}
}

在这个例子中,我们定义了四个主要的操作:获取订单、创建订单、更新订单和删除订单。每个方法都遵循了RESTful的设计规范,并且返回了一个统一的ApiResponse对象。

结论

遵循这些最佳实践可以帮助您构建更加健壮、一致和易于维护的Spring Boot应用。通过统一的设计模式和响应格式,您可以为用户提供更好的体验,并简化未来的开发和维护工作。

相关文章:

SpringBoot开发——Spring Boot Controller 最佳实践

文章目录 1、RESTful接口地址的定义规则2、设计通用控制器基类3、统一的返回对象设计4、统一的异常处理5、实际案例: 订单控制器 (OrderController)结论 随着微服务架构的普及&#xff0c;RESTful API已经成为现代Web服务的标准设计模式。Spring Boot为开发者提供了强大的工具来…...

使用Ubuntu耳机输出正弦波信号

最近有一个项目想使用喇叭发出一个标准的正弦波测试信号&#xff0c;故记录下操作过程 sudo apt install libasound2-dev 否则有可能会报错&#xff1a; alsaaudio.c:28:10: fatal error: alsa/asoundlib.h: No such file or directory 安装pyalsaaudio&#xff1a; pip …...

Python编程 - 协程

前言 上篇文章主要讲述了python的进程&#xff0c;进程池和进程与线程对比等知识&#xff0c;接下来这篇文章再唠唠python的协程&#xff0c;让我们继续往下看&#xff01; 一、协程的使用 python 中的协程是一种用于处理并发任务的高效工具&#xff0c;它依赖于 asyncio 库以…...

如何在没有备份的情况下恢复 Mac 上丢失的数据

Mac 是您数字世界的中心。它上面可能保存着照片和视频等回忆&#xff0c;以及您不再联系的朋友和家人发来的旧电子邮件。您可能花了数小时导入整个 CD 收藏。您还可能保存着重要文档&#xff0c;例如演示文稿和工作文件、家庭账户或学校或大学的作业。 如果由于某种原因您丢失…...

SpringBoot:解析excel

解析Excel文件&#xff0c;可以使用Apache POI库 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version> </dependency> 上代码&#xff1a; /*** <b>Functio…...

Tomcat窗口运行修改窗口标题显示项目日期时间

1、修改配置文件catalina.bat文件 在Tomcat路径 bin文件夹下 set TITLETomcat.xxx.Server [%DATE% %TIME%] 显示&#xff1a;Tomcat.xxx,Server [2024/09.18 周三 12:01:30]...

8-----手机机型维修工具助手 功能较全 涵盖解锁 刷机 修复等选项 维修推荐

上图是一款功能较全的维修加密狗。目前可以无限制 任何人使用。看图片可以了解其中涵盖刷机 解锁 修复分区 查看短接图 安装驱动 修复基带等等选项。而且其中有针对各个机型型号的对应功能操作。以及一些rec5.0相关的操作选项。 通过此博文了解 ★★★★★此工具涵盖的一些…...

集群聊天服务器项目【C++】(四)cmake介绍和简单使用

我们上次用shell命令和vscode编译链接muduo库服务端代码&#xff0c;本章节实现编写CMakeLists.txt来编译项目。本次简单介绍CMake&#xff0c;并用Cmake编译上次的muduo服务器代码。 1.为什么使用cmake 我们在编译项目时&#xff0c;如果编写Makefile的话&#xff0c;常常会…...

Nginx+Tomcat(负载均衡、动静分离)

目录 一、Nginx概述 1.Nginx应用 二、正向代理和反向代理 1.正向代理 1.1主要作用 1.2工作原理 2.反向代理 2.1主要作用 2.2工作原理 三、负载均衡模式 1.轮询 2.最少连接数 3.IP 哈希 4.加权轮询 5.最少时间算法 6.一致性哈希 四、规划部署负载均衡和反向…...

前端分段式渲染较长文章

实现思路&#xff1a; 1. 后端返回整篇文章。 2. JavaScript 分段处理&#xff1a;将文章按一定的字符或段落长度分割&#xff0c;然后逐步将这些段落追加到页面上。 3. 定时器或递归调用&#xff1a;使用 setInterval 或 setTimeout 来控制段落的逐步渲染。 代码实现示例 …...

C#程序员的堕落从nuget开始:将自己的代码发布到nuget

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

【C/C++语言系列】malloc、calloc和realloc区别和用法

这三个函数都是在堆区分配内存的函数&#xff0c;头文件都是&#xff1a; #include<stdlib.h>下面分别介绍这三个函数&#xff1a; malloc&#xff1a; 函数原型&#xff1a; void *malloc(unsigned int num_bytes);功能&#xff1a;堆区开辟一段内存空间 num_nytes&…...

【Linux】POSIX信号量与、基于环形队列实现的生产者消费者模型

目录 一、POSIX信号量概述 信号量的基本概念 信号量在临界区的作用 与互斥锁的比较 信号量的原理 信号量的优势 二、信号量的操作 1、初始化信号量&#xff1a;sem_init 2、信号量申请&#xff08;P操作&#xff09;&#xff1a;sem_wait 3、信号量的释放&#xff08…...

Spring Boot-消息队列相关问题

Spring Boot 消息队列相关问题及解决方案 消息队列&#xff08;Message Queue, MQ&#xff09;在分布式系统中的应用越来越广泛&#xff0c;尤其是在解耦系统、异步通信、负载均衡等场景中起到了至关重要的作用。消息队列为不同的服务提供了一种异步通信的机制&#xff0c;使得…...

[数据集][目标检测]岩石种类检测数据集VOC+YOLO格式4766张9类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4766 标注数量(xml文件个数)&#xff1a;4766 标注数量(txt文件个数)&#xff1a;4766 标注…...

图像分割基本知识

计算机视觉和图像处理 Tensorflow入门深度神经网络图像分类目标检测图像分割 图像分割 一、目标分割1.1 图像分割的定义1.2 任务类型1.2.1 任务描述1.2.2 任务类型 二、语义分割2.1 FCN网络2.1.1网络结构 2.2 Unet网络 三、UNet案例3.1 数据集获取3.1.1 设置相关信息3.1.2 图像…...

LIN总线CAPL函数——干扰LIN帧响应段(linInvertRespBit )

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…...

【30天玩转python】网络编程基础

网络编程基础 网络编程是指编写能够在网络上进行通信的程序&#xff0c;通过网络进行数据的发送与接收。Python 提供了许多库和工具来进行网络编程&#xff0c;如 socket、urllib 和 requests。在这篇文章中&#xff0c;我们将介绍网络编程的基础知识&#xff0c;并演示如何使…...

【PCB工艺】如何实现PCB板层间的互连

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言①、什么是通孔②、通孔是怎样产生的③、通孔种类④、盘中孔⑤、设计建议 前言 送给大学毕业后找不到奋斗方向的你…...

FastAPI--如何自定义Docs UI,包括多个APP、静态资源、元数据等

如何mount 一个FastAPI Application? “Mounting” means adding a completely “independent” application in a specific path, that then takes care of handling everything under that path, with the path operations declared in that sub-application. 示例代码 主…...

CodeMaker:重新定义开发者效率的智能编码助手

CodeMaker&#xff1a;重新定义开发者效率的智能编码助手 【免费下载链接】CodeMaker A idea-plugin for Java/Scala, support custom code template. 项目地址: https://gitcode.com/gh_mirrors/co/CodeMaker 核心价值&#xff1a;告别重复编码&#xff0c;拥抱智能开发…...

万象视界灵坛实战教程:构建小红书爆款笔记封面图‘高点击率特征’预测模型

万象视界灵坛实战教程&#xff1a;构建小红书爆款笔记封面图高点击率特征预测模型 1. 项目背景与价值 在内容创作领域&#xff0c;封面图的质量直接影响用户点击率。小红书平台数据显示&#xff0c;优质封面图能带来300%以上的点击率提升。然而&#xff0c;传统封面设计依赖人…...

4步解决RetroArch缩略图显示异常,恢复游戏库视觉体验

4步解决RetroArch缩略图显示异常&#xff0c;恢复游戏库视觉体验 【免费下载链接】RetroArch Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3. 项目地址: https://gitcode.com/GitHub_Trending/re/RetroArch 在RetroArch的使用过程中&am…...

断更 9 天放大招!OpenClaw 3.22 版全维度升级,龙虾这次真的变超强

各位技术圈的小伙伴&#xff0c;学长来给大家同步个重磅消息&#xff01;火遍全网的 OpenClaw 断更 9 天之后&#xff0c;直接甩出王炸 ——2026.3.22-beta.1 预览版正式上线&#xff0c;这次可不是小修小补&#xff0c;而是从插件架构到安全防护、从模型配置到交互体验的底层大…...

从“认怂”到“被看见”:flomo的产品设计哲学

当大多数笔记软件都在追求“大而全”时&#xff0c;有一款产品选择了一条完全不同的路。它不让你写标题&#xff0c;不支持复杂排版&#xff0c;甚至在官网上大大方方地列出“自己不擅长什么”。它的创始人说&#xff1a;“35岁再创业&#xff0c;我学会了认怂。”它就是flomo&…...

从零搭建一个游戏设置面板:用Horizontal Layout Group搞定选项排布(Unity 2022 LTS)

从零搭建游戏设置面板&#xff1a;Horizontal Layout Group实战指南 在Unity游戏开发中&#xff0c;一个直观易用的设置面板是提升玩家体验的关键组件。本文将带你从零开始&#xff0c;使用Horizontal Layout Group组件构建一个专业的游戏设置界面&#xff0c;涵盖音量控制、画…...

开源工具技术解析与实践指南:突破游戏性能限制的完整方案

开源工具技术解析与实践指南&#xff1a;突破游戏性能限制的完整方案 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 一、问题溯源&#xff1a;帧率限制背后的技术债务分析 当高端显卡在…...

uni-app Android应用华为审核隐私权限提示与上架授权说明实战指南

1. uni-app Android应用华为审核隐私权限问题解析 第一次用uni-app开发Android应用准备上架华为市场时&#xff0c;我被审核驳回的理由整懵了——"缺少权限使用说明"。明明iOS版本在manifest.json配得好好的&#xff0c;怎么到Android就出问题&#xff1f;后来才发现…...

手把手教你玩转双闭环MMC逆变仿真

双闭环&#xff0b;最近电平逼近调制MMC模块化多电平换流器仿真&#xff08;逆变侧&#xff09;含技术文档 MMC Matlab-Simulink 直流侧11kV 交流侧6.6kV N22 采用最近电平逼近调制NLM 环流抑制&#xff08;PIR比例积分准谐振控制&#xff09;&#xff0c;测量桥臂电感THD获得抑…...

Spring Security实战:Bcrypt加密算法在用户密码存储中的正确使用姿势(附完整代码)

Spring Security实战&#xff1a;Bcrypt加密算法在用户密码存储中的正确使用姿势&#xff08;附完整代码&#xff09; 在当今数字化时代&#xff0c;用户密码安全已成为系统开发中最基础也最关键的一环。作为开发者&#xff0c;我们经常面临一个核心问题&#xff1a;如何在数据…...