从0开始全栈项目-09品牌管理编写,使用JSR303数据校验

  1. 后端需要对前端传递过来的数据进行校验,使用 JSR实现
    常用的注解
    在这里插入图片描述
  2. 在controller 的 入参上添加 @Valid注解
    @PostMapping("/add")
    public R add(@Valid @RequestBody WaresBrandVo brandVo){
         brandService.add(brandVo);
         return R.ok(null);
    }
  1. 异常返回的数据和约定格式不一致,所以需要统一处理验证异常情况,在模块内创建一个exception包,里面新建一个类,统一异常类型
/**
 * 错误码和错误信息定义
 * 错误码规定为5位,前两位为业务字段,后3位为具体错误类型
 * 10: 通用
 *      001: 参数格式校验错误
 * 11: 商品
 * 12: 订单
 * 13: 购物车
 * 14: 物流
 */
public enum BizCodeException {
    UNKNOW_EXCEPTION(10000,"系统未知异常"),
    VALID_EXCEPTION(10001,"参数格式校验失败");

    private Integer code;
    private String msg;

    BizCodeException(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}
@Slf4j
@RestControllerAdvice(basePackages = "com.zc.eshop.wares.controller")
public class ValidExceptionAdvice {

    /**
     * 校验参数验证异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleValidException(MethodArgumentNotValidException e){

        log.error("数据校验出错{},异常类型{}",e.getMessage(),e.getClass());
        Map<String, String> collect =
                e.getBindingResult().getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, DefaultMessageSourceResolvable::getDefaultMessage));
        return R.error(BizCodeException.VALID_EXCEPTION,collect);
    }

    /**
     * 包裹全部异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public R handleException(Exception e){


        return R.error(BizCodeException.VALID_EXCEPTION,e.getMessage());
    }

}

这样,所有 com.zc.eshop.wares.controller 抛出的MethodArgumentNotValidException异常都会被捕获, 然后按照规定格式返回给前端

  1. JSR303 分组校验功能。 同一个参数,新增的时候不能要id,修改的时候ID必须填写的情况,假设现在就考虑更新和添加品牌两种情况
    创建 AddBrand 和 UpdateBrand 两个接口。在原先参数上添加 写了分组之后必须所有的校验上都写上分组情况
public class WaresBrandVo {
    /**
     * 主键id
     */
    @ApiModelProperty(value = "主键id", name = "id")
    @Null(groups = {AddBrand.class},message = "添加品牌Id不能填写")
    @NotNull(groups = {UpdateBrand.class},message = "更新品牌缺少id字段")
    private Integer id;
    /**
     * 品牌名称
     */
    @ApiModelProperty(value = "品牌名称", name = "name")
    @NotBlank(groups = {AddBrand.class, UpdateBrand.class})
    private String name;
}
  1. 修改controller 上的注解
    @PostMapping("/add")
    public R add(@Validated(value = AddBrand.class) @RequestBody WaresBrandVo brandVo){
         brandService.add(brandVo);
         return R.ok(null);
    }
  1. 自定义校验。 编写自定义校验注解=》编写自定义校验器=》关联注解和校验器
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值