JSR303参数校验(二):统一异常拦截处理

前言:

              在JSR303参数校验(一)中有提到,期望使用JSR303替换原有的‘if‘来实现参数校验以达到精略代码的效果,但是现在看来代码还是没有得到很大的精简(下图所示,仍然需要一系列代码对校验异常的结果进行处理),而我们的注意力应该在意业务逻辑方面的处理而非这些数据校验,为此引入全局ControllerAdvice类拦截异常并统一处理

 附上异常拦截统一处理代码

package com.atguigu.gulimall.product.exception;
import com.atguigu.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;

/**
 * 集中处理所有异常

 */
@Slf4j
//@ResponseBody//最终以json的格式返回
//@ControllerAdvice(basePackages ="com.atguigu.gulimall.product.controller" ) 标准该类是统一异常处理类,basePackages标注的包都是我们设置异常处理的作用域
@RestControllerAdvice(basePackages ="com.atguigu.gulimall.product.controller" )//该注解等于上面两个注解结合
public class GulimallExceptionControllerAdvice {

    @ExceptionHandler(value = MethodArgumentNotValidException.class)//该注解用于表明这个方法要用来处理哪些异常
    public R handleVaildException(MethodArgumentNotValidException e){
            log.error("数据校验出现问题{},异常类型",e.getMessage(),e.getClass());
        BindingResult bindingResult = e.getBindingResult();//获取到数据校验的错误结果
        Map<String,String> errorMap = new HashMap<>();
        bindingResult.getFieldErrors().forEach(fieldError->{
                errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
        });

        return R.error(400,"校验出现问题").put("data",errorMap);


    }
    @ExceptionHandler(value = Throwable.class)
    public R handleVaildOtheException(Throwable e){
        return R.error(401,"未知异常");

    }

}

说明:

  • @RestControllerAdvice注解标志了该类会拦截所有异常(具体异常由@ExceptionHandler注解指定,有它注解的方法执行异常处理)并最终以JSON的数据格式返回,参数'basePackages'写明了从哪些包中拦截异常
  • @ExceptionHandler注解表明该方法用来拦截哪些异常,上面代码中创建了两个方法,第一个方法'handleVaildException()'用来专门处理数据校验异常,而第二个方法handleVaildOtheException 用来处理其他所有异常
  • 如果某个方法标记了特地的处理某个异常,当出现异常时,会由该方法处理,如果没有特定指定某个异常,则会往下跟大范围的方法中去处理,例如Throwable。(第二个方法写的较为粗略,可以根据自己想要返回的数据格式进行封装代码)

结果:

经过上面的处理之后原来的代码就可以变成

 只需要专心处理业务逻辑即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值