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

Spring Boot:轻松设置全局异常处理

Spring Boot:轻松设置全局异常处理

在软件开发中,异常处理是一项至关重要的任务。对于使用Spring Boot的开发者来说,设置全局异常处理不仅可以提高代码的整洁度,还可以提升用户体验。本文将详细介绍如何在Spring Boot中轻松设置全局异常处理,并涵盖一些相关的Spring Boot特性,如国际化支持和分布式系统架构。

一、异常处理基础

在Java编程中,异常处理是通过try-catch块来实现的。当一个方法在执行过程中遇到异常情况时,它会抛出一个异常对象。这个对象既可以是Java标准库中定义的异常类(如NullPointerException),也可以是自定义的异常类。

在Spring Boot应用中,异常可能发生在多个层级,包括控制器(Controller)、服务(Service)和数据访问层(DAO)。为了有效地处理这些异常,我们需要一个全局的异常处理机制。

二、Spring Boot中的全局异常处理

Spring Boot提供了一种非常简便的方式来设置全局异常处理,那就是使用@ControllerAdvice注解。通过这个注解,我们可以创建一个全局异常处理器,它能够捕获并处理应用中抛出的所有异常。

1. 创建全局异常处理器

首先,我们需要创建一个类,并使用@ControllerAdvice注解来标记它。这个类可以包含多个方法,每个方法都使用@ExceptionHandler注解来指定它能够处理的异常类型。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public ResponseEntity<Object> handleException(Exception e) {// 构建异常响应ApiError apiError = new ApiError(HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage(), e);return new ResponseEntity<>(apiError, HttpStatus.INTERNAL_SERVER_ERROR);}// 可以添加更多的异常处理方法
}

在上面的代码中,GlobalExceptionHandler类使用了@ControllerAdvice注解,这意味着它是一个全局异常处理器。handleException方法使用了@ExceptionHandler注解,并指定了它能够处理Exception.class类型的异常。当应用中抛出任何Exception类型的异常时,这个方法都会被调用。

2. 自定义异常响应

在全局异常处理器中,我们可以自定义异常响应的格式。在上面的代码中,我们创建了一个ApiError类来表示异常响应。这个类包含了HTTP状态码、错误消息和异常对象。

public class ApiError {private HttpStatus status;private String message;private Throwable error;public ApiError(HttpStatus status, String message, Throwable error) {this.status = status;this.message = message;this.error = error;}// 省略getter和setter方法
}

通过自定义异常响应,我们可以向客户端提供更丰富的错误信息,从而帮助他们更好地理解和解决问题。

3. 异常处理策略

在全局异常处理器中,我们可以根据不同的异常类型制定不同的处理策略。例如,对于业务异常,我们可以返回特定的错误码和错误信息;对于系统异常,我们可以记录日志并返回通用的错误信息。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = BusinessException.class)public ResponseEntity<Object> handleBusinessException(BusinessException e) {// 构建业务异常响应ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, e.getMessage(), e);return new ResponseEntity<>(apiError, HttpStatus.BAD_REQUEST);}@ExceptionHandler(value = Exception.class)public ResponseEntity<Object> handleException(Exception e) {// 记录日志logger.error("系统异常:", e);// 构建系统异常响应ApiError apiError = new ApiError(HttpStatus.INTERNAL_SERVER_ERROR, "系统异常,请联系管理员", e);return new ResponseEntity<>(apiError, HttpStatus.INTERNAL_SERVER_ERROR);}
}

在上面的代码中,我们为业务异常和系统异常分别制定了不同的处理策略。对于业务异常,我们返回400状态码和特定的错误信息;对于系统异常,我们记录日志并返回500状态码和通用的错误信息。

三、异常传递方式

在Spring Boot中,异常可以在不同的层级之间传递。当一个方法抛出异常时,如果这个异常没有被当前方法捕获和处理,那么它会被传递到调用栈中的上一层方法。如果上一层方法也没有捕获和处理这个异常,那么异常会继续向上传递,直到被全局异常处理器捕获和处理。

这种异常传递方式使得我们可以在全局异常处理器中统一处理应用中抛出的所有异常,而无需在每个方法中都编写异常处理代码。

四、Spring Boot的其他相关特性

除了全局异常处理之外,Spring Boot还提供了许多其他有用的特性,如国际化支持和分布式系统架构。

1. 国际化支持

Spring Boot提供了强大的国际化支持,使得我们可以轻松地构建多语言应用。通过配置消息源(Message Source)和区域设置解析器(Locale Resolver),我们可以实现根据用户的语言偏好来显示不同的消息。

@Configuration
public class WebConfig implements WebMvcConfigurer {@Beanpublic MessageSource messageSource() {ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();messageSource.setBasename("classpath:messages");messageSource.setDefaultEncoding("UTF-8");return messageSource;}@Beanpublic LocaleResolver localeResolver() {SessionLocaleResolver localeResolver = new SessionLocaleResolver();localeResolver.setDefaultLocale(Locale.US);return localeResolver;}
}

在上面的代码中,我们配置了一个消息源和一个区域设置解析器。消息源加载了位于classpath:messages路径下的消息文件,而区域设置解析器则根据用户的会话来确定其语言偏好。

2. 分布式系统架构

Spring Boot也非常适合构建分布式系统。通过使用Spring Cloud等框架,我们可以轻松地实现服务发现、负载均衡、配置管理等分布式系统架构的关键组件。

例如,我们可以使用Spring Cloud Netflix Eureka来实现服务发现。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

@SpringBootApplication
@EnableEurekaClient
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

在上面的代码中,我们通过@EnableEurekaClient注解将应用注册为Eureka客户端,这样它就可以被其他服务发现了。

五、总结

在Spring Boot中设置全局异常处理是一项非常重要的任务。通过使用@ControllerAdvice注解和@ExceptionHandler注解,我们可以轻松地创建一个全局异常处理器来捕获并处理应用中抛出的所有异常。此外,Spring Boot还提供了许多其他有用的特性,如国际化支持和分布式系统架构,这些特性可以帮助我们构建更加健壮、可扩展和易于维护的应用。

相关文章:

Spring Boot:轻松设置全局异常处理

Spring Boot&#xff1a;轻松设置全局异常处理 在软件开发中&#xff0c;异常处理是一项至关重要的任务。对于使用Spring Boot的开发者来说&#xff0c;设置全局异常处理不仅可以提高代码的整洁度&#xff0c;还可以提升用户体验。本文将详细介绍如何在Spring Boot中轻松设置全…...

Omni3D目标检测

Omni3D是一个针对现实场景中的3D目标检测而构建的大型基准和模型体系。该项目旨在推动从单一图像中识别3D场景和物体的能力&#xff0c;这对于计算机视觉领域而言是一个长期的研究目标&#xff0c;并且在机器人、增强现实&#xff08;AR&#xff09;、虚拟现实&#xff08;VR&a…...

前端三件套开发模版——产品介绍页面

今天有空&#xff0c;使用前端三件套html、css、js制作了一个非常简单的产品制作页面&#xff0c;与大家分享&#xff0c;希望可以满足大家应急的需求。本页面可以对产品进行“抢购”、对产品进行介绍&#xff0c;同时可以安排一张产品的高清大图&#xff0c;我也加入了页面的背…...

Android Bitmap 和Drawable的区别

Bitmap 和 Drawable 是 Android 图形绘制的两种常用方式&#xff0c;它们有各自的特点和使用场景。下面将详细解释它们之间的区别&#xff0c;并通过示例代码说明如何使用它们。 Bitmap 解释 Bitmap 是一种用于存储图像像素数据的类&#xff0c;通常用于图像处理和操作。Bit…...

Linux和windows网络配置文件的修改

Linux和windows网络配置文件的修改 网络配置文件是计算机网络管理中至关重要的一部分。正确配置网络文件可以确保计算机与网络设备之间的通信顺畅&#xff0c;避免网络故障。本文将详细介绍网络配置文件的修改方法&#xff0c;包括常见命令、使用方法举例&#xff0c;以及一些…...

【.NET全栈】第16章 Web开发

文章目录 前言16.1 HTML概述16.1.1 HTML的基本概念16.1.2 HTML语言的基本元素16.1.3 格式设置16.1.4 超级链接16.1.5 图像16.1.6 表格16.1.7 框架16.1.8 表单 16.2 ASP.NET Web Forms的组织16.2.1 认识ASP.NET16.2.2 Web Forms的组织 16.3 Web服务器控件16.3.1 使用Label和Text…...

检测水管缺水的好帮手-管道光电液位传感器

管道光电液位传感器是现代清水管道管理中的重要技术创新&#xff0c;不仅提高了检测液位的精确度&#xff0c;还解决了传统机械式和电容式传感器存在的诸多问题&#xff0c;成为检测管道缺水的可靠利器。 该传感器采用先进的光学感应原理&#xff0c;利用红外光学组件通过精密…...

渗透测试流程基本八个步骤

渗透测试遵循软件测试的基本流程&#xff0c;但由于其测试过程与目标的特殊性&#xff0c;在具体实现步骤上渗透测试与常见软件测试并不相同。渗透测试流程主要包括8个步骤&#xff0c;如下图所示&#xff1a; 下面结合上图介绍每一个步骤所要完成的任务。 (1 )明确目标 当测…...

2024年移动手游趋势:休闲类手游收入逆势增长,欧美玩家成为主力

移动手游广告情报平台Sensor Tower近期发布的报告显示&#xff0c;从宏观数据来看&#xff0c;尽管2023年对于移动游戏市场来说是艰难的一年&#xff0c;无论是总下载量亦或是总收入都较去年有所下降&#xff0c;尤其是Google Play。但在总体下降的大趋势下&#xff0c;休闲游戏…...

npm 淘宝镜像证书过期,错误信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更换 npm 证书 问题描述报错原因更换步骤1 找到 nvm 安装目录2 发现证书过期3 更换新地址4 保存后&#xff0c;重新安装成功 问题描述 在使用 nvm 安装新版本时&#xff0c;未成功&#xff0c;出现报错&#xff1a; Could not retrieve https://npm.taobao.org/mirrors/node/l…...

axios发送请求,后端无法获取cookie

1.前端 axios默认不携带cookie 添加如下代码 import axios from "axios" const requrst axios.create({baseURL: import.meta.env.VITE_APP_URL,timeout: 5000,}) //让axios携带cookie requrst.defaults.withCredentials true 2.后端nestjs main.ts app.enabl…...

【Spring Boot 源码学习】初识 ConfigurableEnvironment

《Spring Boot 源码学习系列》 初识 ConfigurableEnvironment 一、引言二、主要内容2.1 Environment2.1.1 配置文件&#xff08;profiles&#xff09;2.1.2 属性&#xff08;properties&#xff09; 2.2 ConfigurablePropertyResolver2.2.1 属性类型转换配置2.2.2 占位符配置2.…...

开关电源中强制连续FCCM模式与轻载高效PSM,PFM模式优缺点对比笔记

文章目录 前言一、连续FCCM模式优点&#xff1a;缺点&#xff1a; 二,轻载高效PSM&#xff0c;PFM优点&#xff1a;缺点: 总结 前言 今天我们来学习下开关电源中&#xff0c;强制连续FCCM模式与轻载高效PSM&#xff0c;PFM模式优缺点对比 一、连续FCCM模式 优点&#xff1a; …...

5分钟教你用AI把老照片动起来,别再去花49块9的冤枉钱了

文章目录 需要的工具 最近&#xff0c;AI视频在各大平台上&#xff0c;又火了。 只是火的形式&#xff0c;变成了将老照片动起来&#xff0c;打情感牌&#xff0c;或者做很多经典电视剧的再整活。 直接把可灵的生成时间&#xff0c;从以前的4分钟&#xff0c;生生的干成了20分钟…...

Ruby 环境变量

Ruby 环境变量 概述 环境变量在编程中扮演着重要的角色,尤其是在Ruby这样的动态编程语言中。它们是操作系统用来存储有关其操作环境的信息的变量,可以在程序运行时影响其行为。Ruby程序可以通过环境变量来获取配置信息、系统细节或用户特定的设置。本文将深入探讨Ruby中环境…...

BPF:BCC工具 funccount 统计内核函数调用(内核函数、跟踪点USDT探针)认知

写在前面 博文内容涉及BCC工具 funccount 认知funccount 可以帮助用户追踪和分析Linux系统上特定函数、系统探针或USDT探针的运行次数。这对于性能分析、故障排查和系统优化等场景非常有用。理解不足小伙伴帮忙指正 &#x1f603;,生活加油 不必太纠结于当下&#xff0c;也不必…...

DPO算法推导

DPO 核心思想&#xff1a;直接使用偏好数据进行策略优化&#xff0c;省去 reward 模型策略优化。 技术背景知识&#xff1a; 首先给定prompt x&#xff0c;生成两个答案 ( y 1 , y 2 ) Π S F T ( y ∣ x ) (y_1,y_2)~\Pi^{SFT}(y|x) (y1​,y2​) ΠSFT(y∣x) &#xff0c;并通…...

Qt源码分析:窗体绘制与响应

作为一套开源跨平台的UI代码库&#xff0c;窗体绘制与响应自然是最为基本的功能。在前面的博文中&#xff0c;已就Qt中的元对象系统(反射机制)、事件循环等基础内容进行了分析&#xff0c;并捎带阐述了窗体响应相关的内容。因此&#xff0c;本文着重分析Qt中窗体绘制相关的内容…...

docker 安装 禅道

docker pull hub.zentao.net/app/zentao:20.1.1 sudo docker network create --subnet172.172.172.0/24 zentaonet 使用 8087端口号访问 使用禅道mysql 映射到3307 sudo docker run \ --name zentao2 \ -p 8087:80 \ -p 3307:3306 \ --networkzentaonet \ --ip 172.172.172.…...

【简要说说】make 增量编译的原理

make 增量编译的原理 make是一个工具&#xff0c;它可以根据依赖关系和时间戳来自动执行编译命令。 当您修改了源代码文件后&#xff0c;make会检查它们的修改时间是否比目标文件&#xff08;如可执行文件或目标文件&#xff09;新&#xff0c;如果是&#xff0c;就会重新编译…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...