谷粒商城—商品服务—JSR303 校验功能(65~69)

目录

一:JSR303_基本校验方法:

二:JSR303_校验后统一异常处理:

三:JSR303_分组校验:

四:JSR303_自定义校验注解:(参照别的校验注解)


一:JSR303_基本校验方法:

             1)给 Bean 添加校验注解:并定义自己的 message。
                          a:区分不为空:
                                @NotEmpty::用在集合类上面,不能为null,并且长度必须大于0
                                @NotBlank:: 用在String上面,只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
                                @NotNull ::用在基本类型上,不能为null,但可以为空字符串   

/**
 * 商品三级分类
 *
 * @author zhangxudong
 * @email 498798398@gmail.com
 * @date 2021-02-18 16:07:34
 */
@Data
@TableName("pms_category")
public class CategoryEntity implements Serializable {

    @NotEmpty
    @NotBlank(message = "商品名称不能为空")
    @NotNull
    @Email(message = "必须为 一个 合法的 Email")
    @URL(message = "必须为一个 合法的 URL 地址")
    @Min(value = 1, message = "最小为 1")

    /**
     * 分类名称
     */
    @NotBlank(message = "分类名称 不可为空")
    private String name;
    /**
     * 父分类id
     */
    @NotNull(message = "父分类 id 不可为空")
    private Long parentCid;
    /**
     * 层级
     */
    @NotNull(message = "层级 不可为空")
    private Integer catLevel;

    /**
     * 保存此菜单 所有子分类
     */
    @NotEmpty
    private List<CategoryEntity> children;
}

             2)自定义校验规则:(正则表达式)

    /**
     * 检索首字母(必须为字母开头)
     */
    @Pattern(regexp = "/^[a-zA-Z]$/")
    private String firstLetter;

             3)开启校验功能 @Valid:效果:校验错误以后会有,默认相应值。

    @RequestMapping("/save")
    public R save(@Valid @RequestBody BrandEntity brand, BindingResult result) {}

             4)校验出错,处理异常,返回异常提示(在类里处理)(BindingResult)

    /**
     * 保存
     */
    @RequestMapping("/save")
    public R save(@Valid @RequestBody BrandEntity brand, BindingResult result) {

        if (result.hasErrors()) {
            HashMap<String, String> hashMap = new HashMap<>();
            result.getFieldErrors().forEach(fieldError -> {
                        String field = fieldError.getField();
                        String defaultMessage = fieldError.getDefaultMessage();
                        hashMap.put(field, defaultMessage);
                    }
            );
            return R.error(400, "提交数据不合法").put("data", hashMap);
        }

        System.out.printf("brand" + brand);
        brandService.save(brand);

        return R.ok();
    }




 

二:JSR303_校验后统一异常处理:

             1)错误代码:五位数字。10:通用,001:参数格式校验,11:商品,12:订单:13:购物车,14:物流
             2)全局返回数据的枚举类型:

/**
 * @Author zhangsan
 * @Date 2021/3/14 3:36 下午
 * @Version 1.0
 */
public enum BizCodeEnum {

    NKNOW_EXCEPTION(10000, "系统未知异常"),
    VAILD_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;
    }
}

             3)全局异常处理(数据绑定异常)

/**
 * @Author zhangsan
 * @Date 2021/3/14 3:16 下午
 * @Version 1.0
 */
@Slf4j
@RestControllerAdvice
public class GuliMailExceptionControllerAdvice {

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleValidException(MethodArgumentNotValidException exception) {

        log.info("数据校验出现问题,异常类型" + exception.getClass(), exception.getMessage());

        HashMap<String, String> hashMap = new HashMap<>();
        BindingResult result = exception.getBindingResult();
        result.getFieldErrors().forEach(fieldError -> {
                    String field = fieldError.getField();
                    String defaultMessage = fieldError.getDefaultMessage();
                    hashMap.put(field, defaultMessage);
                }
        );
        return R.error(BizCodeEnum.VAILD_EXCEPTION.getCode(), BizCodeEnum.VAILD_EXCEPTION.getMsg())
                .put("data", hashMap);
    }

    /**
     * 全局异常处理方法
     */
    @ExceptionHandler(Throwable.class)
    public R handleException(Throwable throwable) {
        return R.error(BizCodeEnum.NKNOW_EXCEPTION.getCode(), BizCodeEnum.NKNOW_EXCEPTION.getMsg());
    }

}



 

三:JSR303_分组校验:

             1)(没加分组的校验字段,在分组情况下是不生效,只会在 @Validated 下生效,@Validated 比 @Valid 能够多完成 多种场景下复杂校验)
             2)编写 校验分组标识性接口(common 类中):

public interface AddGroup {
}

public interface UpdateGroup {
}

             3)给 Bean 实体类中,加上 校验分组。

    /**
     * 品牌id
     */
    @NotNull(message = "修改商品 id 不可为空", groups = {UpdateGroup.class})
    @Null(message = "新增商品 id 必须为空", groups = {AddGroup.class})
    @TableId
    private Long brandId;

    /**
     * 品牌名
     */
    @NotBlank(message = "商品名称不能为空",
              groups = {AddGroup.class, UpdateGroup.class})
    private String name;

             4)新增 不能为空且必须为 URL 地址 // 修改时 可为空,但必须为 URL 地址。

    /**
     * 品牌logo地址
     */
    @NotBlank(message = "新增 logo 不能为空", groups = {AddGroup.class})
    @URL(message = "Logo 必须为 合法的 URL 地址",
            groups = {AddGroup.class, UpdateGroup.class})
    private String logo;

             5)在 Controller 层,指定分组。(  @Valid -> @Validated )

    /**
     * 保存
     */
    @RequestMapping("/save")
    public R save(@Validated(value = {AddGroup.class})
                  @RequestBody BrandEntity brand) {

        brandService.save(brand);

        return R.ok();
    }





 

四:JSR303_自定义校验注解:(参照别的校验注解)

             1)编写一个 自定义的 校验注解。
             2)编写一个 自定义的 校验器。
             3)关联 自定义的校验器 和 自定义的校验注解。
             4)例:ListValue(Vals={0,1},message="此字段 只能传入 1 或 0")
     

        
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值