SpringBoot 全局异常处理 + 参数校验,企业级规范写法(代码直接复制)
一、前言在 SpringBoot 前后端分离项目里这两个东西几乎是必写基础1.接口参数乱传直接报错到前端2.异常满天飞前端各种无法解析3.每个接口都写 try-catch代码又臭又长4.参数校验逻辑重复维护成本极高今天给你一套企业级标准方案统一返回 全局异常处理 参数校验一次写完全项目通用代码直接复制就能用。二、引入依赖!--web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--参数校验--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactId/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency三、统一返回结果类 Result.javaimportlombok.Data;DatapublicclassResultT{privateIntegercode;privateStringmsg;privateTdata;publicstaticTResultTsuccess(Tdata){ResultTrnewResult();r.setCode(200);r.setMsg(操作成功);r.setData(data);returnr;}publicstaticTResultTsuccess(){returnsuccess(null);}publicstaticTResultTerror(Integercode,Stringmsg){ResultTrnewResult();r.setCode(code);r.setMsg(msg);returnr;}publicstaticTResultTerror(Stringmsg){returnerror(500,msg);}}四、实体类加参数校验注解importlombok.Data;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.NotNull;importjavax.validation.constraints.Size;DatapublicclassUser{privateLongid;NotBlank(message用户名不能为空)Size(min3,max20,message用户名长度3-20位)privateStringusername;NotBlank(message密码不能为空)Size(min6,max20,message密码长度6-20位)privateStringpassword;NotNull(message年龄不能为空)privateIntegerage;}五、自定义业务异常publicclassBusinessExceptionextendsRuntimeException{privateIntegercode;publicBusinessException(Stringmessage){super(message);this.code500;}publicBusinessException(Integercode,Stringmessage){super(message);this.codecode;}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;RestControllerAdviceSlf4jpublicclassGlobalExceptionHandler{/** * 校验异常 */ExceptionHandler(MethodArgumentNotValidException.class)publicResult?handleValidException(MethodArgumentNotValidExceptione){FieldErrorfieldErrore.getBindingResult().getFieldError();StringmsgfieldError.getDefaultMessage();log.error(参数校验异常{},msg);returnResult.error(400,msg);}ExceptionHandler(BindException.class)publicResult?handleBindException(BindExceptione){FieldErrorfieldErrore.getFieldError();StringmsgfieldError.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;RestControllerRequestMapping(/user)publicclassUserController{PostMapping(/add)publicResult?add(ValidRequestBodyUseruser){// 模拟业务异常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.coloradmin.cn/o/2518929.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!