统一异常处理实现

  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;
        }
    }
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值