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

Java编程高频的“技术点”-01:自定义全局异常处理器

一、自定义全局异常处理器在 Spring Boot 中自定义校验异常的统一处理通常通过RestControllerAdvice全局异常处理器配合ExceptionHandler异常拦截来实现。这样做的好处是当Valid或Validated校验失败时我们不需要在每个 Controller 里写重复的try-catch或if-else逻辑而是由全局处理器统一捕获并向前端返回格式一致、语义清晰的 JSON 错误信息。以下是实现统一异常处理的标准步骤和完整代码示例️ 1. 引入必要的依赖确保你的pom.xml中包含了 Spring Boot 的 Web 和 Validation 启动器Spring Boot 3.x 默认使用jakarta.validationdependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency 2. 创建全局异常处理器核心代码新建一个类如GlobalExceptionHandler使用RestControllerAdvice注解。我们需要重点捕获两种最常见的校验异常MethodArgumentNotValidException处理 Controller 层RequestBody参数校验失败如 POST/PUT 请求的 JSON 数据。ConstraintViolationException处理 GET 请求的RequestParam、PathVariable或 Service 层方法参数校验失败。import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import org.springframework.http.HttpStatus; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; RestControllerAdvice public class GlobalExceptionHandler { /** * 处理 RequestBody 参数校验失败 (如 POST/PUT 请求) * 异常类型MethodArgumentNotValidException */ // 返回 400 状态码 ExceptionHandler(MethodArgumentNotValidException.class) ResponseStatus(HttpStatus.BAD_REQUEST) public MapString, Object handleValidationExceptions( MethodArgumentNotValidException ex) { MapString, Object response new HashMap(); response.put(code, 400); response.put(message, 参数校验失败); // 提取所有字段的错误信息拼接成易读的格式 String errors ex.getBindingResult().getFieldErrors().stream() .map(fieldError - fieldError.getField() : fieldError.getDefaultMessage()) .collect(Collectors.joining(, )); response.put(errors, errors); return response; } /** * 处理 RequestParam / PathVariable * 或 Service 层方法参数校验失败 (如 GET 请求) * 异常类型ConstraintViolationException */ ExceptionHandler(ConstraintViolationException.class) ResponseStatus(HttpStatus.BAD_REQUEST) public MapString, Object handleConstraintViolationException( ConstraintViolationException ex) { MapString, Object response new HashMap(); response.put(code, 400); response.put(message, 参数校验失败); // 提取异常中的约束违规信息 String errors ex.getConstraintViolations().stream() .map(ConstraintViolation::getMessage) .collect(Collectors.joining(, )); response.put(errors, errors); return response; } /** * 兜底处理捕获其他未处理的系统异常防止直接暴露堆栈信息给前端 */ ExceptionHandler(Exception.class) ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public MapString, Object handleSystemException(Exception ex) { MapString, Object response new HashMap(); response.put(code, 500); response.put(message, 系统内部错误请联系管理员); return response; } } 3. 实际效果演示假设你有一个接收用户注册的 DTO并且加上了校验规则public class UserRegisterDTO { NotBlank(message 用户名不能为空) private String username; NotBlank(message 密码不能为空) Size(min 6, max 16, message 密码长度必须在6到16位之间) private String password; // getter / setter }当前端传入了不合法的 JSON 数据例如{username: , password: 123}时全局异常处理器会自动拦截并返回如下结构化的 JSON{ code: 400, message: 参数校验失败, errors: username: 用户名不能为空, password: 密码长度必须在6到16位之间 } 最佳实践建议统一返回结构在实际的企业级项目中建议将返回的Map替换为一个专门的ApiResponseT泛型类包含 code, message, data 字段这样能让前后端交互的接口规范更加统一。国际化支持如果你的项目需要支持多语言可以在NotBlank(message {user.username.notblank})中使用占位符并配合 Spring Boot 的国际化i18n资源文件如messages_zh.properties,messages_en.properties来动态返回不同语言的错误提示。避免暴露敏感信息在兜底的Exception处理中千万不要直接把ex.getMessage()或堆栈信息返回给前端以免暴露系统内部逻辑或数据库结构。
http://www.zskr.cn/news/1353864.html

相关文章:

  • Worldquant研究顾问速通
  • 南通市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • 襄阳市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • 孝感市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • 荣耀出征手游官网下载:荣耀出征最新官方下载渠道
  • 全科吃透稳上岸!浙大MBA笔试四科高分备考实战经验
  • YOLO26涨点改进| SCI 2026 |独家创新首发、卷积改进篇| 引入TVconvCA平移变分卷积交叉注意力机制,助力医学图像检测与分割、缺陷检测、焊缝检测、工业表面检测、遥感小目标检测任务涨点
  • RPA 外部 API 触发执行与执行结果回调通知开发实录
  • 内江市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • 多合一烧写器技术解析:从接口协议到选型实战
  • 工业触摸一体机应用于汽车工厂,实现标准化作业指导
  • 2026年6月PMP最后15天:放弃幻想,照抄这份极简计划
  • 智慧树自动刷课插件:终极指南帮你告别手动刷课烦恼
  • 2026年口碑超棒!广东高定品牌供应商排名大揭秘,速来围观!
  • Linux文件查找与压缩解压核心命令实战指南
  • 踩坑记录:爬虫代理 403/超时问题的 5 层排查法
  • 基于RK3576的边缘AI部署实战:从模型转换到安卓应用优化
  • Keil MDK编译错误602解决方案:许可证与组件配置匹配
  • 机场地勤运维管控:黎阳之光无感监管,规范作业流程,提升运维效能
  • 嵌入式JavaScript混合开发:C与JS高效互调实践指南
  • 嵌入式核心板选型实战:从AI加速到工业控制的设计权衡与趋势
  • 基于EM9283与FPGA的工业便携式WiFi数据终端设计实战
  • catlass:昇腾算子模板库的设计哲学
  • 2026年秦皇岛冷库维修口碑商家推荐:秦皇岛冷库维修/秦皇岛冷库加氟/秦皇岛冷库安装/秦皇岛冷库清洗/选择指南 - 海棠依旧大
  • 廊坊市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • 智能电视应用生态破局:从开源硬件到多系统玩法全解析
  • APT32F110 RTC实战:从配置校准到低功耗应用全解析
  • python悦读圈图书共享系统 图书借阅系统 图书捐赠系统 微信小程序
  • 如何轻松实现JetBrains IDE试用期重置:三步操作智能续期工具指南
  • 邯郸市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收