SpringBoot:SpringBoot统一响应和统一异常处理

一、前言

  在开发Spring Boot应用时,处理响应结果和异常的方式对项目的可维护性、可扩展性和团队协作有着至关重要的影响。分散的响应结果和异常处理逻辑往往会导致代码冗余、难以理解和维护。因此,统一结果返回和统一异常处理是提升项目质量的关键策略之一。

二、统一结果返回

  统一结果返回通常意味着为所有控制器方法定义一个标准的响应格式。这可以通过创建一个或多个响应实体类来实现,这些类包含了状态码、消息和数据等通用字段。控制器方法在处理完业务逻辑后,会填充这些字段并返回给客户端。

  接下来让我们一起看看在SpringBoot中如何实现统一结果返回。

1. 定义通用的响应对象

  创建一个通用响应对象,定义成功和失败的返回场景,并确保该通用返回对象在接口中得到使用。

public class ResponseResult {private int code;private String message;private Object data;public static ResponseResult success(Object data) {ResponseResult responseResult = new ResponseResult();responseResult.setData(data);responseResult.setCode(ResultEnum.SUCCESS.code);return responseResult;}public static ResponseResult error(ResultEnum resultEnum) {return error(resultEnum, resultEnum.message);}public static ResponseResult error(ResultEnum resultEnum, String message) {ResponseResult responseResult = new ResponseResult();responseResult.setCode(resultEnum.code);responseResult.setMessage(message);return responseResult;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}
}

2. 定义接口响应状态码

  定义一组公共状态码是统一结果返回的核心关键之一。这种做法不仅提高了API的易用性和可维护性,还使得客户端能够更高效地解析和处理响应数据,同时也为API的开发者提供了一个清晰、一致的标准来遵循。

public enum ResultEnum {SUCCESS(200 ,"请求处理成功"),SERVICE_ERROR(500, "服务器异常,请稍后重试");public final Integer code;public final String message;ResultEnum(Integer code, String message) {this.code = code;this.message = message;}
}

3. 定义统一的成功和失败的处理方法

public class ResponseResult {private int code;private String message;private Object data;public static ResponseResult success(Object data) {ResponseResult responseResult = new ResponseResult();responseResult.setData(data);responseResult.setCode(ResultEnum.SUCCESS.code);return responseResult;}public static ResponseResult error(ResultEnum resultEnum) {return error(resultEnum, resultEnum.message);}public static ResponseResult error(ResultEnum resultEnum, String message) {ResponseResult responseResult = new ResponseResult();responseResult.setCode(resultEnum.code);responseResult.setMessage(message);return responseResult;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}
}

4. Controller统一响应结果

@GetMapping("/testResult")public ResponseResult test() {// 模拟业务逻辑try {// 假设这里有一些业务逻辑return ResponseResult.success("success");} catch (Exception e) {// 捕获异常并返回错误信息return ResponseResult.error(ResultEnum.SERVICE_ERROR);}}

三、统一异常处理

  统一异常处理则是通过全局异常处理器来捕获并处理控制器中抛出的异常。这种方式可以避免在每个控制器方法中编写重复的异常处理代码,同时也使得异常处理逻辑更加集中和易于管理。

@RestControllerAdvice
  @RestControllerAdvice 是一个组合注解,它是 @ControllerAdvice 和 @ResponseBody 的结合体。它主要用于为控制器(Controller)层提供全局的配置,如异常处理、数据绑定、数据预处理等。由于它包含了 @ResponseBody,所以所有通过 @RestControllerAdvice 处理的方法都会默认将返回值写入HTTP响应体中,并设置合适的Content-Type。

@ExceptionHandler
  @ExceptionHandler注解用于标记一个方法,该方法用于处理控制器中抛出的异常。当控制器中的方法抛出异常时,Spring会查找是否有@ExceptionHandler注解的方法能够处理该异常。如果有,则调用该方法,并返回其响应。

注意

当使用@ControllerAdvice时,我们需要将@ResponseBody添加到异常处理方法上。
如果我们使用@RestControllerAdvice,就不需要添加。

1.定义业务异常类

  统一异常类可以帮助你更好地管理错误和异常,使得整个系统的错误处理更加一致和可预测。

public class BusinessException extends RuntimeException{private final ResultEnum resultEnum;public BusinessException(ResultEnum resultEnum, String message) {super(message);this.resultEnum = resultEnum;}public BusinessException(ResultEnum resultEnum) {this(resultEnum, resultEnum.message);}}

2. 全局异常处理器

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler({BusinessException.class})public ResponseResult handleBusinessException(BusinessException businessException, HttpServletRequest request) {// 想处理的业务return ResponseResult.error(ResultEnum.SERVICE_ERROR, businessException.getMessage());}/*** 其他异常* @param e* @return*/@ExceptionHandler(value = Exception.class)public ResponseResult handleOtherExceptions(Exception e) {// 这里可以根据不同的异常类型返回不同的状态码和消息// 但为了简单起见,这里只返回一个通用的错误信息return ResponseResult.error(ResultEnum.SERVICE_ERROR);}}

3. 统一处理使用

@GetMapping("/testException1")public ResponseResult test1() {if (true) {// 业务场景throw new BusinessException(ResultEnum.SERVICE_ERROR);}return ResponseResult.success("success");}

统一异常处理使用好处

  代码复用:避免了在多个地方编写相似的响应结果和异常处理代码。

  易于维护:当需要修改响应格式或异常处理逻辑时,只需在一个地方进行修改。

  团队协作:团队成员可以更容易地理解和遵循统一的编码规范。

  扩展性:如果需要添加新的响应类型或异常处理逻辑,只需在现有基础上进行扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/41528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Java面向对象三大特征中多态的分析及出现类型转换异常ClassCastException,通过关键字instanceof解决的方法

多态 众所周知java的面向对象编程思想,有三大特征:封装、继承、多态。今天来研究一下多态,首先我们要知道多态的好处,为什么要学习多态 原始方式new的对象既能调用重写的,还能调用继承的、自己特有的成员。但缺点是扩…

科研绘图系列:R语言STAMP图(STAMP Plot)

介绍 STAMP图(STAMP plot)并非一个广泛认知的、具有特定名称的图表类型,而是可能指在STAMP(Statistical Analysis of Metagenomic Profiles:“STAMP: statistical analysis of taxonomic and functional profiles”)软件使用过程中生成的各种统计和可视化图表的总称。ST…

Ubuntu 24.04 上安装 Kubernetes,超级详细的教程!

Kubernetes 是一个免费的开源容器编排工具,它允许基于容器的应用程序的自动化部署、扩展和管理。 我们将介绍如何使用 Kubeadm 逐步在 Ubuntu 24.04 上安装 Kubernetes 此次演示中,我们将使用以下三个 Ubuntu 24.04 实例 Instance 1 : Master Node (k…

Studying-代码随想录训练营day30| 452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间

第30天,贪心part04,加油,编程语言:C 目录 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间 总结 452.用最少数量的箭引爆气球 文档讲解:代码随想录用最少数量的箭引爆气球 视频讲解:手…

费马点猜想,求解,如何用java编写?

“费马点”是指位于三角形内且到三角形三个顶点距离之和最短的点。这个点与三角形三顶点连线构成的三个钝角都相等且为 120。注意,这不是“费马大定理”。 package com.ai157.aigc.controller.test; import javafx.application.Application; import javafx.scene.G…

一站式天气预报解决方案,API接口轻松接入

天气对我们的日常生活有着重要的影响,无论是出门旅行还是安排工作,都需要提前了解天气情况。WAPI平台提供了一站式天气预报解决方案,通过简单的API接口,轻松获取各类天气预报数据。 这个API接口提供了丰富的天气预报信息&#xf…

AI Agent技术的最新进展与改变世界的典型项目巡礼

AI Agent 探索 1. AI Agent 技术发展以及典型项目 1.0 前 AI Agent 时代 在学术探索的浩瀚星空中,机器人技术领域的璀璨明珠莫过于Agent技术的深入研究,这一领域历来是创新与突破的温床。回溯至大模型浪潮兴起之前,Agent技术的辉煌篇章便已…

7月强化|跟武忠祥,写严选题还是880题

严选题和武老师的高数强化讲义是一套的,做的时候可以很明显感觉到,严选题上面的题跟讲义也是对应上的。如果大家要选择严选题,那么建议搭配武忠祥老师的强化课和强化讲义一起使用。😎 我当时强化阶段也是跟武老师的强化课&#xf…

欧洲智慧能源展揭幕,海博思创闪耀登场展示储能创新

近日,备受瞩目的欧洲智慧能源展(The Smarter E Europe)盛大开幕,吸引了全球能源行业的目光。在这场国际性的盛会中,中国储能行业的领军企业海博思创凭借卓越的技术实力和创新的解决方案,成为展会上一颗耀眼…

AOP在业务中的简单使用

背景 业务组有一些给开发用的后门接口,为了做到调用溯源,业务组最近需要记录所有接口的访问记录,暂时只需要记录接口的响应结果,如果调用失败,则记录异常信息。由于后门接口较多以及只是业务组内部轻度使用&#xff0…

vim未找到命令,且yum install vim安装vim失败

vim未找到命令,且yum安装vim失败 1、wget更新yum云资源,本次更新为华为云镜像资源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repowget报未找到命令,请查看文章Linux wget…

黑马苍穹外卖技术亮点 详情

1.使用工厂模式和策略模式实现布隆过滤器解决缓存穿透问题 Bitmap Bitmap是一种数据结构,它使用位图来表示数据。在处理大量数据时,Bitmap可以通过将每个数据元素映射到一个位,然后使用位运算来对数据进行操作。 通过使用Bitmap&#xff0c…

C++期末整理

课堂笔记 构造与析构 #include <iosteam> #include <cstring> using namespace std;struct Date {int y, m, d;void setDate(int, int, int);Date(int yy, int mm, int dd) {y yy, m mm, d dd;} };class Student { private:char* name;Date birthday; public:…

视频号矩阵源码:构建短视频生态的基石

在数字化时代&#xff0c;视频内容已成为连接品牌与消费者的重要桥梁。视频号矩阵源码&#xff0c;作为短视频营销自动化的创新引擎&#xff0c;正在帮助内容创作者和营销团队以前所未有的效率和智能&#xff0c;管理和扩展他们的视频内容。本文将深入探讨视频号矩阵源码的核心…

RTL8211FSI PHY电路设计

文章目录 硬件设计引脚功能框图说明PHYADDRPageLED 模式自动协商/速度/全半双工模式Soft Reset上电顺序 原理图设计参考 软件控制&#xff08;FPGA&#xff09;硬件调试 硬件设计 引脚 笔者前代数字采集板采用的 PHY 芯片是博通 Boardcom 的 B50610&#xff0c;其仅支持 0 ∼…

leetcode 152. 乘积最大子数组「贪心」「动态规划」

152. 乘积最大子数组 题目描述&#xff1a; 给你一个整数数组nums&#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff0c;并返回该子数组所对应的乘积 思路1&#xff1a;贪心 由于 n u m s [ i ] nums[i] nums[i]都是整数&#xff0c;所以多乘一些数肯定不会让绝…

Java 方法中循环调用具有事务的方法

在Java中&#xff0c;循环调用一个具有事务的方法时&#xff0c;需要特别注意事务的边界和管理。通常&#xff0c;事务的边界是由框架&#xff08;如Spring&#xff09;来控制的&#xff0c;确保方法执行时数据的完整性和一致性。然而&#xff0c;在循环中调用事务方法时&#…

RAG:本地部署Langchain-Ollma(Windows)

RAG&#xff1a;本地部署Langchain&#x1f99c;&#x1f517;-Ollma&#x1f42b;(Windows) RAG&#xff0c;即“Retrieval Augmented Generation”&#xff08;检索增强生成&#xff09;&#xff0c;是一种结合了检索和生成技术的自然语言处理模型。它主要用于文本生成任务&…

对SRS媒体服务器进行漏洞扫描时,SRS的API模块会出现漏洞,如何修补这些漏洞的简单方法

目录 一、引言 1、srs介绍 2、媒体流介绍 3、应用场景 二、SRS的http_api介绍、及漏洞 1、概述 2、http_api模块的作用 &#xff08;1&#xff09;提供HTTP API服务 &#xff08;2&#xff09;管理和监控SRS服务器 &#xff08;3&#xff09;自定义开发 三、漏洞扫描…

单位立方体各个面上的法向量,向量场以及每个面上的通量

单位立方体各个面上的法向量&#xff0c;向量场 F ( x , y , z ) \mathbf{F} (x, y, z) F(x,y,z) 以及每个面上的通量 flyfish 假设我们有一个单位立方体&#xff0c;向量场 F ( x , y , z ) \mathbf{F} (x, y, z) F(x,y,z) 在该立方体上。 法向量 &#xff1a;单位立方…