Spring Boot 封装统一返回结果及全局异常处理

news2024/9/29 13:22:44

在开发Web应用时,我们经常需要处理各种不同的业务逻辑,并返回统一格式的响应数据给前端。同时,为了提高代码的可维护性和用户体验,全局异常处理也变得尤为重要。Spring Boot提供了一种简洁的方式来实现这些功能。

统一返回结果封装

首先,我们可以定义一个统一的返回结果类,用于封装所有的返回数据。

java
public class ApiResponse<T> {
    private int code;
    private String message;
    private T data;

    private ApiResponse(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(200, "Success", data);
    }

    public static <T> ApiResponse<T> failure(int code, String message) {
        return new ApiResponse<>(code, message, null);
    }

    // Getters and Setters
}

使用ControllerAdvice进行全局异常处理

接下来,我们可以使用@ControllerAdvice注解来定义全局异常处理器。

java
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ApiResponse<Object> handleException(Exception e) {
        // 日志记录异常信息
        // Log the exception
        return ApiResponse.failure(500, "Internal Server Error: " + e.getMessage());
    }

    // 可以添加更多的异常处理方法
}

自定义异常

为了更细致地控制异常处理,我们可以定义一些自定义异常。

java
public class BusinessException extends RuntimeException {
    private int code;

    public BusinessException(int code, String message) {
        super(message);
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

然后,在全局异常处理器中添加对自定义异常的处理。

java
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(BusinessException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ApiResponse<Object> handleBusinessException(BusinessException e) {
        return ApiResponse.failure(e.getCode(), e.getMessage());
    }

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ApiResponse<Object> handleException(Exception e) {
        // Log the exception
        return ApiResponse.failure(500, "Internal Server Error: " + e.getMessage());
    }
}

在Controller中使用

在Controller中,我们可以直接返回ApiResponse对象。

java
@RestController
@RequestMapping("/api")
public class MyController {

    @GetMapping("/success")
    public ApiResponse<User> getSuccess() {
        User user = new User("John Doe", 30);
        return ApiResponse.success(user);
    }

    @GetMapping("/failure")
    public ApiResponse<Object> getFailure() {
        throw new BusinessException(400, "Bad Request");
    }
}

结果展示

这样,无论我们的业务逻辑如何变化,前端收到的数据格式都是统一的,这使得前端开发更加方便和高效。

在设计和维护API时,除了统一返回结果之外,还有很多其他最佳实践可以帮助提高API的可维护性。以下是一些关键点:

  1. 遵循RESTful原则:设计API时应使用标准的HTTP方法(GET, POST, PUT, DELETE等)对资源进行操作,这样可以简化接口设计,提高API的可读性和维护性。

  2. 版本控制:随着产品的发展,API可能会发生变化。合理地管理API版本是确保向后兼容的关键。一种常见的做法是在URL或请求头中包含版本号,例如 /api/v1/users 或在请求头中添加 X-API-Version: v1。

  3. 数据过滤、排序和分页:为了减少不必要的数据传输,API应支持数据的过滤、排序和分页功能。这不仅可以提高响应速度,还能减轻服务器的负担。

  4. 错误处理:良好的错误处理机制对于API的可用性和稳定性至关重要。除了返回标准的错误代码和消息外,还应提供足够的信息以帮助开发者定位问题,但同时要避免泄露敏感信息。

  5. 安全性:保证API的安全性是不容忽视的一环。实施身份验证和授权机制,如OAuth或JWT(JSON Web Tokens),以确保只有授权用户才能访问敏感数据或执行特定操作。

  6. 代码示例:提供一个简单的Express.js API示例,展示了如何实现上述的一些最佳实践,包括遵循REST原则的API端点,支持分页查询,并实现了基本的错误处理。

  7. 选择合适的架构模式:设计API时,选择合适的架构模式对于优化性能至关重要。你的选择应当满足系统的具体需求,同时支持可扩展性、可靠性和可维护性。

  8. 优化数据管理:在提高API性能的数据模型设计中,需要重点优化数据处理以提升检索速度、减少处理时间,增强API的扩展性和响应能力。

  9. 最小化数据传输和有效负载:为了提高API性能,最大限度地减少非必要的数据传输和优化有效负载大小至关重要。提供选择性检索功能、实施分页技术、应用压缩技术、启用数据过滤和利用缓存控制等策略,可以优化数据传输、减少有效负载大小,并提升API的整体性能。

  10. 最小化网络往返:网络延迟直接影响API的响应时间和用户体验。优化API性能和最小化网络延迟的关键在于减少网络往返次数,提高API性能。

  11. 实行速率限制和节流策略:速率限制和节流是控制API请求频率,防止API资源被滥用或过载的重要手段。这些策略有助于保障API的公平、高效使用,同时维持其稳定性和性能。

  12. 测试和性能调优:性能和可扩展性的测试是确保API性能达到最优的关键环节。这一过程可以帮助我们识别性能瓶颈、验证系统的可扩展性、优化响应时间、保障系统的可靠性、设定性能基准,并提升用户体验。

通过实施这些最佳实践,可以确保API的可维护性、性能和安全性,从而提供更高质量的服务。

总结

通过封装统一的返回结果和全局异常处理,我们可以让Spring Boot应用更加健壮和易于维护。这种方法不仅提高了代码的可读性,还有助于减少重复代码,使得异常处理更加集中和一致。

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

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

相关文章

深入浅出MongoDB(三)

深入浅出MongoDB&#xff08;三&#xff09; 文章目录 深入浅出MongoDB&#xff08;三&#xff09;复制副本集设置分片分片实例备份与恢复监控ObjectId 复制 复制时将数据同步在多个服务器的过程&#xff0c;提供了数据的冗余备份&#xff0c;在多个服务器上存储数据副本&#…

操作平台使用中应每月不少于几次定期检查?

在当今数字化时代&#xff0c;操作平台作为企业与个人日常运营的核心载体&#xff0c;其稳定性和安全性直接关系到业务的高效运行与数据的严密保护。因此&#xff0c;定期进行操作平台的检查与维护&#xff0c;成为了不可忽视的重要环节。特别是&#xff0c;确保每月进行不少于…

肯富来 CRM 数字化项目启动,引领企业“智”变新时代

近年来&#xff0c;广东肯富来泵业股份有限公司&#xff08;以下简称“肯富来”&#xff09;开启企业数字化、智能化转型之路&#xff0c;利用云计算技术贯通全制程的信息化管理系统、通过高速网络端到端全覆盖实现生产可视化&#xff0c;并通过远程数据系统&#xff0c;帮助客…

日志的艺术:深入理解 spdlog

目录 1. 为什么需要日志&#xff1f; 2. 同步日志 vs. 异步日志 3. spdlog 的核心组成部分 4. 如何创建一个Logger 5. 如何选择输出目标&#xff08;Sink&#xff09; 6. 个性化你的日志格式 7. 异步日志的魔法 8. 刷新策略&#xff1a;何时将日志写入 9. 调整线程池&…

强化学习入门——Pybullet初体验

Pybullet 最近一直在想如何进行RL的学习&#xff0c;在学习RL的过程中&#xff0c;好的模拟仿真平台是非常重要的。除了Gym&#xff0c;还了解到Pybullet模块可以简便快捷地创建仿真环境&#xff0c;所以学习一下。 1.简介 PyBullet 是一个用于机器人学、游戏开发和图形研究…

mycat读写分离中间件

5、部署Mycat读写分离中间件服务 5.1安装Mycat服务 将Mycat服务的二进制软件包Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz上传到Mycat虚拟机的/root目录下&#xff0c;并将软件包解压到/use/local目录中 5.2赋予解压后的mycat目录权限 5.3向/etc/profile系统变量…

PyQt5与Html的关于地图位置显示的动态交互

PyQt5与Html的关于地图位置显示的动态交互 1 前言2 python部分3 HTML代码4 注意总结 1 前言 上篇本是放弃关于Folium的动态显示&#xff0c;但是在仔细对比Folium在python的直接应用与Html中的写法&#xff0c;其实两者没有什么区别&#xff0c;都是基于Leaflet上建立区域&…

[大语言模型-论文精读] 词性对抗性攻击:文本到图像生成的实证研究

[大语言模型-论文精读] 词性对抗性攻击&#xff1a;文本到图像生成的实证研究 目录 文章目录 [大语言模型-论文精读] 词性对抗性攻击&#xff1a;文本到图像生成的实证研究目录文章研究背景 文章标题摘要1 引言2 相关工作3 数据集创建3.1 数据收集3.2 目标提示生成3.3 数据集注…

[ACS_C]:以 H2和 O2等离子体处理的 Al2O3为载体的 Pt 催化剂用于液态有机氢载体对二苄基甲苯和全氢二苄基甲苯的加氢和脱氢

摘要&#xff1a;二苄基甲苯 (DBT) 是一种很有前途的液态有机氢载体 (LOHC)&#xff0c;理论储氢量为 6.2 wt%&#xff0c;可与可再生能源发电系统耦合。本工作采用一种方便、环保的等离子体处理方法改性氧化铝表面羟基和表面氧空位 (SOV)。通过浸渍处理后的氧化铝制备了不同的…

如何修复变砖的手机并恢复丢失的数据

您可能之前听说过“变砖”&#xff0c;但您知道什么是变砖手机吗&#xff1f;正如许多论坛中经常提出的问题一样&#xff0c;我如何知道我的手机是否变砖了&#xff1f;好吧&#xff0c;手机变砖主要有两种类型&#xff0c;即软件变砖和硬变砖。软变砖手机意味着重启后您仍然可…

MATLAB guide选择图片和全局变量使用

文章目录 前言一、按键选取文件二、全局化变量使用全局华使用 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、按键选取文件 [filename,pathname]…

想要编辑 PDF 文件?使用这 10 种最佳 PDF 编辑工具

您是否遇到过利益干系人要求您对 PDF 文件进行细微更改的情况&#xff1f; 通常我们会这样做&#xff01; 但是&#xff0c;对你来说&#xff0c;做出要求的改变有多难呢&#xff1f; 好吧&#xff0c;当您没有用于创建 PDF 文件的源文件时&#xff0c;问题就来了。是的&…

如何选购适合自己的内衣洗衣机?五款热门卓越型号测评推荐

相信不少小伙伴都跟我一样&#xff0c;一方面&#xff0c;认为内裤、袜子与大件的上衣、裤子放一块清洗&#xff0c;会感觉很不卫生&#xff0c;而且穿在身上也不安心。但是另一方面&#xff0c;本身又很懒惰&#xff0c;也不想自己用手洗&#xff0c;不但经常会遗漏一些污渍&a…

探索 DaPy:Python 中的 AI 数据处理新贵

文章目录 探索 DaPy&#xff1a;Python 中的 AI 数据处理新贵背景介绍DaPy 是什么&#xff1f;如何安装 DaPy&#xff1f;DaPy 的简单函数使用方法加载数据数据筛选数据聚合数据可视化自定义函数 DaPy 在实际场景中的应用数据预处理数据分析数据处理与集成 常见 Bug 及解决方案…

蓝牙资讯|2024可穿戴市场的手表将出现下滑,耳机和戒指将增长

市场调查机构 IDC 发布博文&#xff0c;预测 2024 年全球可穿戴设备出货量达到 5.379 亿台&#xff0c;同比增长 6.1%。IDC 预计新兴市场的进一步普及和成熟市场的更新周期的开始将推动听力设备的发展&#xff0c;因为消费者希望更换大流行病时期购买的产品。 IDC 预估 2024 …

VS2017安装Installer Projects制作Setup包

下载安装扩展包 VS2017默认未安装Installer Projects Package&#xff0c;需要联机下载&#xff1a; 也可网页上下载离线InstallerProjects.vsix文件&#xff1a; https://visualstudioclient.gallerycdn.vsassets.io/extensions/visualstudioclient/microsoftvisualstudio20…

Spring Boot 进阶-Spring Boot 如何实现自定义的过滤器详解

在上一篇文章中我们讲解了关于拦截器的相关内容,并且通过一个防抖的例子来讲解了拦截器在实际开发中的使用。这篇文章我们为大家带来的就是关于过滤器的相关内容的分享。下面我们首先来介绍一下什么是过滤器。 什么是过滤器? 过滤器Filter,是Servlet技术中最常用的技术,开…

K8S精进之路-控制器DaemonSet -(3)

介绍 DaemonSet就是让一个节点上只能运行一个Daemonset Pod应用&#xff0c;每个节点就只有一个。比如最常用的网络组件&#xff0c;存储插件&#xff0c;日志插件&#xff0c;监控插件就是这种类型的pod.如果集群中有新的节点加入&#xff0c;DaemonSet也会在新的节点创建出来…

【Router】路由功能之DMZ(Demilitarized Zone)功能介绍及实现

DMZ&#xff08;Demilitarized Zone&#xff09; DMZ&#xff08;非军事化区域&#xff09;是一个位于内部网络和外部网络之间的分段区域。在一个网络中&#xff0c;DMZ通常包含运行公共服务的服务器或其他设备。 DMZ是一个位于内部网络和外部网络之间的分段区域&#xff0c;用…

wpa_cli支持EAP-TLS认证运行设计

wpa_cli支持EAP-TLS认证运行设计 1 输入 1.1启动wpa_supplicant 和 wpa_cli 在OpenHarmony开发板或华为开发机的命令行中输入 wpa_supplicant -Dnl80211 -c/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf -gabstract:/data/service/el1/public/wifi/sock…