校园课程助手【3】-使用枚举类封装异常优雅处理全局异常
创始人
2024-11-14 18:35:03
0次

接着2中登录模块补充一个点:

//可以看到这里返回给前端控制器的是一个类而不是html页面     public RespBean doLogin(@Valid LoginVo loginVo, HttpServletRequest request,HttpServletResponse response){         return userService.doLogin(loginVo, request, response);     } 

首先:在本项目中,所有的Controller类返回给前端控制器的都是ResBean对象,下面是这个类的实现,属性包括返回代码,提示信息以及一个Object类。

package com.example.seckilldemo.vo; import lombok.Data;  /**  * @Author wuyifan  * @Date 2024/4/22 16:17  * @Version 1.0  */ @Data  public class RespBean {     private long code;     private String message;     private Object object;      public static RespBean success() {         return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), null);     }      public static RespBean success(Object object) {         return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), object);     }      public static RespBean error(RespBeanEnum respBeanEnum) {         return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), null);     }      public static RespBean error(RespBeanEnum respBeanEnum, Object object) {         return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), object);     }      public RespBean(long code, String message, Object object) {         this.code = code;         this.message = message;         this.object = object;     }      public RespBean(){      }      public long getCode() {         return code;     }      public void setCode(long code) {         this.code = code;     }      public String getMessage() {         return message;     }      public void setMessage(String message) {         this.message = message;     }      public Object getObject() {         return object;     }      public void setObject(Object object) {         this.object = object;     } }  

其中返回代码和信息是自定义一个枚举类实现的,用于优雅的处理全局异常信息,其类代码如下:

package com.example.seckilldemo.vo;  import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString;  /**  * @Author wuyifan  * @Date 2024/4/22 16:17  * @Version 1.0  */ @ToString @Getter @AllArgsConstructor public enum RespBeanEnum {     //通用     SUCCESS(200, "SUCCESS"),     ERROR(500, "服务端异常"),      //登录模块     LOGIN_ERROR(500210, "用户名或者密码不正确"),     MOBILE_ERROR(500211, "手机号码格式不正确"),     BIND_ERROR(500212, "参数校验异常"),     MOBILE_NOT_EXIST(500213, "手机号码不存在"),     PASSWORD_UPDATE_FAIL(500214, "更新密码失败"),     SESSION_ERROR(500215, "用户SESSION不存在"),       //秒杀模块     EMPTY_STOCK(500500, "库存不足"),     REPEATE_ERROR(500501, "该商品每人限购一件"),     REQUEST_ILLEGAL(500502, "请求非法,请重新尝试"),     ERROR_CAPTCHA(500503, "验证码错误,请重新输入"),     ACCESS_LIMIT_REACHED(500504, "访问过于频繁,请稍后重试"),     //订单模块5003xx     ORDER_NOT_EXIST(500300, "订单不存在"),      ;      private final Integer code;     private final String message;      public Integer getCode() {         return code;     }      public String getMessage() {         return message;     } }  

最后:介绍本项目使用上述枚举类封装一个优雅的 Spring Boot 全局异常处理的过程。
即使用 @ControllerAdvice 和 @ExceptionHandler 处理全局异常:

  1. 新建异常信息实体类(即RespBean )
  2. 自定义异常类型。
    一般我们处理的都是 RuntimeException ,所以如果你需要自定义异常类型的话直接集成这个类就可以了。
package com.example.seckilldemo.exception;  import com.example.seckilldemo.vo.RespBean; import com.example.seckilldemo.vo.RespBeanEnum;  /**  * 全局异常  *  * @author: wuyifan  * @date 2024/5/2 5:32 下午  * @ClassName: GlobalException  */ public class GlobalException extends RuntimeException {      private RespBeanEnum respBeanEnum;      public RespBeanEnum getRespBeanEnum() {         return respBeanEnum;     }      public void setRespBeanEnum(RespBeanEnum respBeanEnum) {         this.respBeanEnum = respBeanEnum;     }      public GlobalException(RespBeanEnum respBeanEnum) {         this.respBeanEnum = respBeanEnum;     } }  
  1. 新建异常处理类
    我们只需要在类上加上@ControllerAdvice注解这个类就成为了全局异常处理类,当然你也可以通过 assignableTypes指定特定的 Controller 类,让异常处理类只处理特定类抛出的异常。
package com.example.seckilldemo.exception;  import com.example.seckilldemo.vo.RespBean; import com.example.seckilldemo.vo.RespBeanEnum; import org.springframework.validation.BindException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice;   /**  * 全局异常处理类  *  * @author: wuyifan  * @date 2024/5/2 5:33 下午  * @ClassName: GlobalExceptionHandler  */ @RestControllerAdvice public class GlobalExceptionHandler {      @ExceptionHandler(Exception.class)     public RespBean ExceptionHandler(Exception e) {         if (e instanceof GlobalException) {             GlobalException exception = (GlobalException) e;             return RespBean.error(exception.getRespBeanEnum());         } else if (e instanceof BindException) {             BindException bindException = (BindException) e;             RespBean respBean = RespBean.error(RespBeanEnum.BIND_ERROR);             respBean.setMessage("参数校验异常:" + bindException.getBindingResult().getAllErrors().get(0).getDefaultMessage());             return respBean;         } //        System.out.println("异常信息" + e);         return RespBean.error(RespBeanEnum.ERROR);     } }  

这样使用枚举类优雅的封装异常信息,通过自定义异常类型,最后交给全局异常类处理就可以啦啦啦啦啦!

相关内容

热门资讯

玩家必知教程!!浙江游戏大厅透... 您好,浙江游戏大厅这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家在这款...
免费测试版开挂脚本!KELE多... 免费测试版开挂脚本!KELE多功能开挂脚本,KELE切实存在有开挂脚本KELE辅助器是一种具有地方特...
新手必备!凯旋麻将开挂脚本软件... 新手必备!凯旋麻将开挂脚本软件工具,凯旋麻将一直有开挂曝光APP(有挂攻略);凯旋麻将简单的透视挂控...
技巧知识分享外挂app!胡乐竞... 技巧知识分享外挂app!胡乐竞技多功能外挂app,胡乐竞技一直真的有外挂app1、很好的工具软件,可...
重大来袭!上游炸金花辅助器脚本... 重大来袭!上游炸金花辅助器脚本软件工具,上游炸金花最初有辅助器科普APP(果真有挂);上游炸金花是一...
技术分享辅助器工具!微乐江西麻... 技术分享辅助器工具!微乐江西麻将多功能辅助器工具,微乐江西麻将确实真的是有辅助器工具1、完成微乐江西...
实测教程!湖北雅苑麻将辅助挂脚... 实测教程!湖北雅苑麻将辅助挂脚本软件工具,湖北雅苑麻将起初是真的有辅助挂分享APP(有挂工具)是一款...
盘点几款外挂软件!大宝麻将多功... 盘点几款外挂软件!大宝麻将多功能外挂软件,大宝麻将原来存在有外挂软件大宝麻将脚本下载中分为三种模型:...
AI教程!微乐四川麻将辅助挂脚... AI教程!微乐四川麻将辅助挂脚本软件工具,微乐四川麻将果然有辅助挂分享APP(真实有挂);一、微乐四...
专业讨论辅助器技巧!开心娱乐多... 专业讨论辅助器技巧!开心娱乐多功能辅助器技巧,开心娱乐一贯真的是有辅助器技巧1、下载好开心娱乐透视辅...