统一异常处理实现

  1. 引入依赖包

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-validation</artifactId>
    	<version>2.3.4.RELEASE</version>
    </dependency>
    
  2. 后端逻辑代码

    /**
     * 使用统一异常处理,通过@RestControllerAdvice能自动获取抛出的异常
     * @param brand
     * @return
     */
    @RequestMapping("/save")
    public R save(@Valid @RequestBody BrandEntity brand){
          
          
        brandService.save(brand);
        return R.ok();
    }
    
  3. 异常处理类

    package com.kenai.gulimall.product.exception;
    import com.kenai.common.exception.BizCodeEnum;
    import com.kenai.common.utils.R;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 集中处理所有异常
     * @RestControllerAdvice注解相当于@ResponseBody注解和@ControllerAdvice注解的合体
     * @ResponseBody注解: 结果返回json数据返回到页面上
     * @ControllerAdvice注解: 处理异常
     */
    @RestControllerAdvice(basePackages = "com.kenai.gulimall.product.controller")
    @Slf4j
    public class GulimallExceptionControllerAdvice {
          
          
        @ExceptionHandler(value = MethodArgumentNotValidException.class)
        public R handleValidException(MethodArgumentNotValidException e){
          
          
            log.error("数据校验出现问题:{},异常类型:{}", e.getMessage(), e.getClass());
            BindingResult bindingResult = e.getBindingResult();
            Map<String, String> errorMap = new HashMap<>();
            bindingResult.getFieldErrors().forEach((item) -> {
          
          
                errorMap.put(item.getField(), item.getDefaultMessage());
            });
            return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data", errorMap);
        }
    
        /**
         * Throwable是exception和error的父类。如果出现MethodArgumentNotValidException外的其他异常,则用该方法处理
         * @param throwable
         * @return
         */
        @ExceptionHandler(value = Throwable.class)
        public R handleException(Throwable throwable){
          
          
            return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());
        }
    }
    
  4. 错误码和错误信息定义(枚举)类

    package com.kenai.common.exception;
    
    /**
     * 错误码和错误信息定义类
     * 1, 错误码定义规则为五位数字
     * 2。 前两位表示业务场景,最后三位表示错误码。比如10001: 10表示通用,001表示系统未知异常
     * 3。 维护错误码后需要维护错误描述,将他们定义为枚举类型
     * 错误码列表:
     * 10:通用
     *   001:参数格式校验
     * 11:商品
     * 12:订单
     * 13:购物车
     * 14:物流
     */
    public enum BizCodeEnum {
          
          
        UNKNOWN_EXCEPTION(10000, "系统未知异常"),
        VALID_EXCEPTION(10001, "系统格式校验失败");
    
        private int code;
        private String msg;
    
        BizCodeEnum(int code, String msg){
          
          
            this.code = code;
            this.msg = msg;
        }
    
        public int getCode() {
          
          
            return code;
        }
    
        public String getMsg() {
          
          
            return msg;
        }
    }
    

猜你喜欢

转载自blog.csdn.net/qq_26496077/article/details/114363091
今日推荐