Spring Boot实现异常处理

Spring Boot 提供了多种灵活的方式实现异常处理,以下是核心方案和最佳实践:


一、基础异常处理方案

1. @ControllerAdvice + @ExceptionHandler(全局处理)
@ControllerAdvice
public class GlobalExceptionHandler {// 处理特定异常(如业务异常)@ExceptionHandler(BusinessException.class)public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException ex) {ErrorResponse error = new ErrorResponse(ex.getCode(), ex.getMessage());return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);}// 处理所有未捕获异常@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {ErrorResponse error = new ErrorResponse("500", "服务器内部错误");return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);}
}// 自定义错误响应体
@Data
class ErrorResponse {private String code;private String message;// 可扩展时间戳、路径等字段
}

作用

  • 捕获控制器层抛出的所有异常,返回结构化错误信息
  • 支持区分异常类型定制HTTP状态码和响应体
2. @ResponseStatus(简单场景)
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "资源不存在")
public class ResourceNotFoundException extends RuntimeException {// 自动返回404状态码和指定消息
}

二、REST API 增强处理

1. 自定义错误数据结构
{"timestamp": "2025-06-22T10:00:00","status": 404,"error": "Not Found","path": "/api/users/999"
}

通过继承 DefaultErrorAttributes 可扩展字段:

@Component
public class CustomErrorAttributes extends DefaultErrorAttributes {@Overridepublic Map<String, Object> getErrorAttributes(...) {Map<String, Object> map = super.getErrorAttributes(...);map.put("traceId", UUID.randomUUID().toString()); // 添加追踪IDreturn map;}
}
2. OpenAPI/Swagger 集成

@ControllerAdvice 中补充注解:

@Operation(responses = {@ApiResponse(responseCode = "400", description = "业务参数错误"),@ApiResponse(responseCode = "500", description = "系统内部错误")
})

三、特殊场景处理

1. 校验异常处理(Validation)

自动捕获 MethodArgumentNotValidException

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleValidationExceptions(MethodArgumentNotValidException ex) {String errorMsg = ex.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(", "));return new ResponseEntity<>(new ErrorResponse("400", errorMsg), HttpStatus.BAD_REQUEST);
}
2. Servlet 容器级错误

配置 ErrorController 处理404等底层错误:

@RestController
public class CustomErrorController implements ErrorController {@RequestMapping("/error")public ResponseEntity<ErrorResponse> handleError(HttpServletRequest request) {Integer status = (Integer) request.getAttribute("javax.servlet.error.status_code");return new ResponseEntity<>(new ErrorResponse(status.toString(), "请求路径不存在"), HttpStatus.valueOf(status));}
}

四、最佳实践建议

  1. 分层处理

    • 业务层抛出自定义异常(如 OrderNotFoundException
    • 控制器层专注参数校验和流程控制
    • 全局处理器统一转换异常为响应
  2. 日志记录
    @ExceptionHandler 中记录错误堆栈:

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex, HttpServletRequest request) {log.error("Request {} failed: {}", request.getRequestURI(), ex.getMessage(), ex);// ...返回响应
    }
    
  3. 前端友好
    返回标准化错误码(如 1001=用户不存在),便于前端识别处理。


五、完整项目结构示例

src/main/java/
├── exception/
│   ├── GlobalExceptionHandler.java  # 全局处理器
│   ├── BusinessException.java       # 自定义业务异常
│   └── ErrorResponse.java           # 错误响应体
└── config/└── CustomErrorAttributes.java   # 错误属性扩展

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

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

相关文章

【目标检测】IOU的概念与Python实例解析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

Vue2中如何使用vue-print-nb打印功能

插件官网地址&#xff1a;vue-print-nb - npm 1.安装 npm install vue-print-nb --save 2.导入打印插件 //main.js import Print from vue-print-nb Vue.use(Print); 3.配置参数 4.页面使用 <div id"printDiv">打印内容</div><el-button v-print&…

Matplotlib快速入门

目录 基本使用 解决中文乱码 一个坐标系绘制多个图像 多个坐标系绘制 基本使用 什么是Matplotlib 是专门用于开发2D图表(包括3D图表)以渐进&#xff0c;交互式方式实现数据可视化 为什么要学习matplotlib 可视化是在整个数据挖掘的关键辅助工具&#xff0c;可以清晰的理解…

扣料不允许‘货物移动’

遇到了报错&#xff0c;不允许货物移动 以为又是和之前一样是订单已经关闭&#xff0c;看是领错料还是财务误关的原因&#xff0c;但是co03一看订单状态并没有关闭 原因就是这个CRTD 订单只是创建了&#xff0c;但是没有下达 找个正常的看看&#xff1a; 一般订单创建和下达都…

【AI】全新AI测试系列之二--------AI自动化测试,提高测试效率

目录 一、自动化测试 1、与手动测试对比 2、自动化测试流程 二、自动化测试环境搭建 三、web自动化使用AI的两种方式 1、利用DeepSeek快速生成脚本 2、pycharm集成通义灵码 四、通义灵码实战 1、使用提示词生成代码 2、使用pytest框架 前言&#xff1a;上一章节只要是…

npm包冲突install失败

--legacy-peer-deps是npm&#xff08;Node.js包管理器&#xff09;的一个命令行选项&#xff0c;主要用于解决依赖冲突问题。当安装依赖时&#xff0c;npm默认会严格检查peer dependencies&#xff08;对等依赖&#xff09;的版本兼容性&#xff0c;可能导致安装失败。启用此选…

68、数据访问-crud实验-删除用户完成

68、数据访问-crud实验-删除用户完成 以下是完成“数据访问-CRUD实验-删除用户”功能的一般步骤&#xff0c;以常见Web应用框架&#xff08;如Spring Boot MyBatis-Plus、Django、Ruby on Rails&#xff09;为例&#xff1a; #### 准备工作 - **数据库表设计**&#xff1a;确…

实现 TurtleBot3 多点轨迹跟踪导航

系统架构 move_base本身不支持一次性发送多个目标点并自动按顺序导航,使用nav_msgs/Path消息类型发布多个路径点,然后让机器人按顺序依次到达每个路径点。 发布一个包含多个路径点的Path消息(可选,用于在RVIZ中显示路径)。按顺序将每个路径点作为MoveBaseGoal发送给move_…

《人性的优点》:破解忧虑密码,构建积极人生

我强烈推荐4本可以改变命运的经典著作&#xff1a; 《寿康宝鉴》在线阅读白话文《欲海回狂》在线阅读白话文《阴律无情》在线阅读白话文《了凡四训》在线阅读白话文 一、世界观&#xff1a;忧虑的本质与生命的真相 &#xff08;一&#xff09;忧虑是精神的“虚构苦难” 卡耐基…

D2554探鸽协议,sensor属性,回调

D2554探鸽协议&#xff0c;sensor属性&#xff0c;回调 各属性的默认值 对比度&#xff1a; 0x4064&#xff08;10进制&#xff09; 清晰度、锐度&#xff1a; 0x000&#xff08;10进制&#xff09; 饱和度&#xff1a; …

.NET 4.7中使用NLog记录日志到数据库表

1. 首先安装必要的NuGet包 在项目中安装以下NuGet包&#xff1a; NLog NLog.Config (可选&#xff0c;用于自动生成配置文件) 相应的数据库提供程序&#xff08;如System.Data.SqlClient for SQL Server&#xff09; Install-Package NLog Install-Package NLog.Config In…

非对称加密实战:Python实现数字签名

目录 非对称加密实战&#xff1a;Python实现数字签名引言&#xff1a;数字世界的身份验证1. 非对称加密基础1.1 核心概念1.2 非对称加密算法比较 2. 数字签名原理2.1 数字签名工作流程2.2 数字签名的核心特性 3. RSA数字签名实现3.1 RSA算法数学基础3.1.1 密钥生成3.1.2 签名生…

优化提示词的常用技巧

优化提示词的常用技巧 1. 告诉AI你需要的重要要素 &#xff08;1&#xff09;风格&#xff1a;明确语言风格 优化前&#xff1a;写一篇人工智能的介绍。优化后&#xff1a;写一篇100字的人工智能介绍&#xff0c;受众是小学生&#xff0c;语言幽默。 &#xff08;2&#xf…

PyTorch实战(12)——StyleGAN详解与实现

PyTorch实战(12)——StyleGAN详解与实现 0. 前言1. StyleGAN1.1 模型介绍1.2 模型策略分析2. 实现 StyleGAN2.1 生成图像2.2 风格迁移小结系列链接0. 前言 StyleGAN (Style-Generative Adversarial Networks) 是生成对抗网络 (Generative Adversarial Networks, GAN) 的变体…

XML重复查询一条Sql语句??怎么解决

一、核心问题&#xff1a;从SQL重复执行到日志失效 1. 首要现象&#xff1a;XML重复查询失效 在排查服务性能时发现&#xff1a; <!-- MyBatis XML片段 --> <select id"List" resultMap"Map"> SELECT * FROM user WHERE name #{name} …

量化面试绿皮书:33. 不公平的硬币

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 33. 不公平的硬币 你有1000枚硬币。 其中&#xff0c;有1枚硬币正反两面都是正面。 其他的999枚硬币都是公平的硬币。 你随机选择一枚硬币并…

Java 期末考试题

1. 如果将类 MyClass 声明为 public&#xff0c;它的文件名必须是 ( ) 才能正常编译。 解&#xff1a;① 如果一个类被声明为 public&#xff0c;则必须以 .java 作为文件拓展名。 答案&#xff1a;MyClass.java 2. 定义类头时能使用的修饰符是&#xff08; &#xff09;…

跨标签页通信(三):Web Storage

在现代 Web 应用中&#xff0c;跨标签页通信的需求越来越普遍。无论是实现多标签页之间的数据同步&#xff0c;还是构建实时协作功能&#xff0c;跨标签页通信都能极大地提升用户体验。今天&#xff0c;我们将探讨一种简单而高效的实现方式&#xff1a;Web Storage。 一、什么…

大疆上云api 无人机摄像头红外调色模式

# topic thing/product/{你的机场}/property/set# 监听topic&#xff0c;获取设置结果 thing/product//property/set_reply#mqtt https://developer.dji.com/doc/cloud-api-tutorial/cn/api-reference/dock-to-cloud/mqtt/aircraft/m3d-properties.htmlthermal_current_palet…

DeepSeek与ChatGPT:免费与付费背后的选择逻辑

内容简介&#xff1a; 为什么有免费的DeepSeek&#xff0c;很多人还在付费用ChatGPT&#xff1f;作为20年互联网老兵&#xff0c;作者通过实测发现&#xff1a;AI工具好坏七成看你怎么跟它聊天。DeepSeek不是真的不如ChatGPT&#xff0c;而是需要掌握"撩AI"的技巧。文…