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

SpringBoot 全局异常处理 + 参数校验,企业级规范写法(代码直接复制)

一、前言

在 SpringBoot 前后端分离项目里,这两个东西几乎是必写基础:
1.接口参数乱传,直接报错到前端
2.异常满天飞,前端各种无法解析
3.每个接口都写 try-catch,代码又臭又长
4.参数校验逻辑重复,维护成本极高
今天给你一套企业级标准方案:统一返回 + 全局异常处理 + 参数校验,一次写完,全项目通用,代码直接复制就能用。

二、引入依赖

<!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--参数校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

三、统一返回结果类 Result.java

importlombok.Data;@DatapublicclassResult<T>{privateIntegercode;privateStringmsg;privateTdata;publicstatic<T>Result<T>success(Tdata){Result<T>r=newResult<>();r.setCode(200);r.setMsg("操作成功");r.setData(data);returnr;}publicstatic<T>Result<T>success(){returnsuccess(null);}publicstatic<T>Result<T>error(Integercode,Stringmsg){Result<T>r=newResult<>();r.setCode(code);r.setMsg(msg);returnr;}publicstatic<T>Result<T>error(Stringmsg){returnerror(500,msg);}}

四、实体类加参数校验注解

importlombok.Data;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.NotNull;importjavax.validation.constraints.Size;@DatapublicclassUser{privateLongid;@NotBlank(message="用户名不能为空")@Size(min=3,max=20,message="用户名长度3-20位")privateStringusername;@NotBlank(message="密码不能为空")@Size(min=6,max=20,message="密码长度6-20位")privateStringpassword;@NotNull(message="年龄不能为空")privateIntegerage;}

五、自定义业务异常

publicclassBusinessExceptionextendsRuntimeException{privateIntegercode;publicBusinessException(Stringmessage){super(message);this.code=500;}publicBusinessException(Integercode,Stringmessage){super(message);this.code=code;}publicIntegergetCode(){returncode;}}

六、全局异常处理器

importlombok.extern.slf4j.Slf4j;importorg.springframework.validation.BindException;importorg.springframework.validation.FieldError;importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice@Slf4jpublicclassGlobalExceptionHandler{/** * 校验异常 */@ExceptionHandler(MethodArgumentNotValidException.class)publicResult<?>handleValidException(MethodArgumentNotValidExceptione){FieldErrorfieldError=e.getBindingResult().getFieldError();Stringmsg=fieldError.getDefaultMessage();log.error("参数校验异常:{}",msg);returnResult.error(400,msg);}@ExceptionHandler(BindException.class)publicResult<?>handleBindException(BindExceptione){FieldErrorfieldError=e.getFieldError();Stringmsg=fieldError.getDefaultMessage();log.error("参数绑定异常:{}",msg);returnResult.error(400,msg);}/** * 自定义业务异常 */@ExceptionHandler(BusinessException.class)publicResult<?>handleBusinessException(BusinessExceptione){log.error("业务异常:{}",e.getMessage());returnResult.error(e.getCode(),e.getMessage());}/** * 系统异常 */@ExceptionHandler(Exception.class)publicResult<?>handleException(Exceptione){log.error("服务器异常",e);returnResult.error("服务器繁忙,请稍后重试");}}

七、Controller 测试接口

importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.validation.Valid;@RestController@RequestMapping("/user")publicclassUserController{@PostMapping("/add")publicResult<?>add(@Valid@RequestBodyUseruser){// 模拟业务异常if("admin".equals(user.getUsername())){thrownewBusinessException("该用户名已被占用");}returnResult.success("添加成功");}}

八、效果演示

1. 参数为空返回

{"code":400,"msg":"用户名不能为空","data":null}

2. 业务异常返回

{"code":500,"msg":"该用户名已被占用","data":null}

3. 正常返回

{"code":200,"msg":"操作成功","data":"添加成功"}

九、新手必看 4 个坑

忘了加 @Valid,校验不生效
必须在实体类前加 @Valid 才会触发校验。
GET 请求用 @RequestBody 报错
GET 没有请求体,参数校验用 @RequestParam + 校验注解。
异常信息暴露给前端
用全局异常统一包装,绝不返回堆栈信息。
自定义异常不生效确保类上有 @RestControllerAdvice 注解。

十、总结

这套代码是SpringBoot 项目标配:
所有异常统一处理
前端只需要解析一种格式
代码干净、规范、易维护
完全符合企业真实开发标准
不管是课设、毕设、还是实战项目,直接复制就能用。
十一、互动引导
你项目里还在用 try-catch 硬扛异常吗?评论区说说你踩过的异常坑,我帮你一起解决!
有用记得点赞 + 收藏,关注我,持续更新 Java 后端企业级实战内容!

http://www.cnnetsun.cn/news/1899604.html

相关文章:

  • 告别‘nvcc not found’:手把手教你为PyCUDA正确配置CUDA环境变量
  • 别再死磕ADAMS了!用Solidworks+Simulink做机电联合仿真的保姆级避坑指南
  • 无需花里胡哨,近80种改进策略,仅需一行可改进任意优化算法!
  • 3步永久备份微信聊天记录:开源工具WeChatExporter深度指南
  • 保姆级教程:YOLOv8鹰眼目标检测镜像快速部署与使用指南
  • 为什么你的多模态模型在图文检索上SOTA,却在视频问答任务上暴跌41%?——多任务权重自适应调度算法深度拆解
  • 从Facebook Demucs到你的项目:Musdb18数据集在音乐分轨模型训练中的实战避坑指南
  • UE5新手必看:三步搞定Nanite,让你的场景模型瞬间‘电影级’
  • AI新手必看!从入门到精通,这份学习路线图助你轻松入门人工智能!
  • Python3.11镜像场景应用:Web开发、数据分析、AI脚本全能环境
  • FreeRTOS队列实战:从阻塞机制到中断安全通信
  • 为什么要选全文降AI?推荐这3个工具一次搞定整篇论文
  • 清音听真应用场景:Qwen3-ASR-1.7B支撑AI面试官对候选人回答的实时语义分析
  • FireRedASR Pro自定义热词增强:提升垂直领域术语识别准确率
  • Hunyuan-MT-7B应用场景:论文、合同长文档翻译,一次搞定不断片
  • 机器学习入门:基本概念与流程
  • Qwen3.5推理模型实战体验:手把手教你搭建个人AI代码助手
  • 低浓度瓦斯处理痛点破解|GC-BLOCK瓦斯热电系统实测分享
  • Node.js后端服务调用Phi-3-mini:构建AI中间层REST API实战
  • Cursor Free VIP:终极解决方案,突破Cursor AI限制,免费享受Pro功能
  • 视频理解大模型正面临“语义鸿沟”危机?2026奇点大会提出的动态概念对齐框架,72小时内可集成
  • 图片服务器被刷流量怎么办?防盗链、限速、黑名单三招防劫持
  • LFM2.5-1.2B-Thinking实战分享:Ollama部署,用它来帮你梳理工作思路
  • Phi-4-mini-reasoning镜像安全合规说明:本地化部署规避API泄露与数据外传风险
  • Qwen3-ASR-1.7B模型结构解析:深入理解CNN在语音识别中的应用
  • 告别眨眼和心电干扰:用Python+MNE库实战EEG预处理全流程(含ICA去伪迹代码)
  • 千问3.5-2B效果展示:高清图主体识别+中英文OCR+场景问答真实案例集
  • **发散创新:基于Rust的内存安全防御技术实战解析**在现代软件开
  • Pixel Epic · Wisdom Terminal 结合WSL2:打造Windows下无缝AI开发环境
  • 20260414_202828_滴滴大模型二面:你项目中_RAG_的存储架构是怎么设计的?