后端校验--jsr303的学习

本文深入探讨JSR303数据校验框架,讲解如何利用注解进行高效的数据验证,包括@NotNull、@NotEmpty、@Pattern等注解的使用,以及自定义校验注解和分组校验的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看着尚硅谷最新的谷粒商城,学到新的知识,就是JSR303数据校验,知识颇多。学完之后,打算以博客的形式梳理该阶段的知识。
导入jar包
在这里插入图片描述

看了这个视频我才知道,javax包下居然有这么多的校验注解可以使用,比使用正则表达式来处理强的多,面对复杂场景有很大灵活性,减少很多代码。都在javax.validation.constraints包下
在这里插入图片描述

另外在提一下,Url这个注解是在org.hibernate.validator.constraints.URL,保证是以url格式的。
还有这些注解可以使用
在这里插入图片描述

首先大家看一下这个Bean前几个属性

/**
     * 品牌id
     */
    @NotNull(message = "修改必须指定id",groups = {UpdateGroup.class})
    @Null(message = "新增不能指定id",groups = {AddGroup.class})
    @TableId
    private Long brandId;
    /**
     * 品牌名
     */
    @NotBlank(message = "品牌名必须提交",groups = {UpdateGroup.class,AddGroup.class})
    private String name;
    /**
     * 品牌logo地址
     */
    @URL(message = "logo必须是一个合法的url地址",groups = {AddGroup.class,UpdateGroup.class})
    @NotEmpty(groups = {AddGroup.class})
    private String logo;
    /**
     * 介绍
     */
    private String descript;
    /**
     * 显示状态[0-不显示;1-显示]
     */
    //自定义校验
            @NotNull(groups = {AddGroup.class,UpdateStstusGroup.class})
            @ListValue(vals={0,1},groups = {AddGroup.class,UpdateStstusGroup.class})
    private Integer showStatus;
    /**
     * 检索首字母
     */
    @NotEmpty(groups = {AddGroup.class})
    @Pattern(regexp = "^[a-zA-z]$",message = "检索首字母必须是一个字母",groups ={AddGroup.class,UpdateGroup.class})
    private String firstLetter;
    /**
     * 排序
     */
    @Min(value = 0,message = "排序必须大于等于0",groups ={AddGroup.class,UpdateGroup.class} )
    @NotNull(groups = {AddGroup.class})
    private Integer sort;

我简单说一下这几个的区别
@NotBlack,只用于String,不能为null且trim()之后size>0
@NotEmpty 用在集合类上面
加了@NotEmpty的String类、Collection、Map、数组,是不能为null或者长度为0的(String Collection Map的isEmpty()方法)
@NotNull:不能为null,但可以为empty,没有Size的约束
其中品牌id不是我们确定的,而是数据库的情况来,一般id这种形式都要用NotNull注解。
检索搜字母,需要我们使用正则表达式,第一个必须是字母。
我们可以给Bean添加上述校验注解,并定义自己的message提示,当校验出现问题抛出message,日志中可以查询。

分组问题
由于业务场景不一样,我们需要保存品牌,修改品牌。保存品牌,我们的品牌id可以为空,修改品牌,我们不能为空。这种需求就需要我们采用分组注解,修改是一个组,添加一个品牌是一个组。
这些这些组,我们写一个接口就可以,不需要填写任何内容。
在这里插入图片描述
同时为了使我们这些组能够生效,毕竟请求首先经过controller层,我们可以在方法里面加入@Validated注解,该注解的校验就会生效。在这里插入图片描述
自定义校验
showStatus字段,是我们实现逻辑删除最重要的字段,该字段是就两个值,1表示品牌上架,0表示品牌下架。这种需求就需要我们使用自定义注解
1.需要我们编写一个自定义的校验注解。
该注解我们定义了他的值信息,vals必须是0,1
定义组信息,定义message提示信息,定义payload,意思就是对接收者有用的信息。
在这里插入图片描述

同时我们需要自定义抛出信息,javax.validator包下的信息都在ValidationMessages里面,我们在注解中定义好message信息后,在ValidationMessages这个文件中填入相关信息
在这里插入图片描述
2.编写一个自定义的校验器 ConstraintValidator

校验注解如果要使用,必须加入校验器,该校验器必须实现ConstraintValidator接口,接口泛型的第一个参数名称是该注解的名称,第二个参数是校验数据的类型
实现两个方法第一个是注解的初始化方法 ,该方法可以获取listValue注解的详细信息,第二个 isValid方法,判断是否校验成功。
同时在该类中定义hashSet容易,保存在vals中的值。

在这里插入图片描述

3.关联自定义的校验器和自定义的校验注解
在注解类中添加入自定义的校验器
在这里插入图片描述
如何给前端返回我们的注解的错误信息的,就需要我们的BindingResult,
@Valid 和 BindingResult 是一 一对应的,如果有多个@Valid,
那么每个@Valid后面都需要添加BindingResult用于接收bean中的校验信息。

 Map<String, String> errors = result.getFieldErrors().stream().collect(Collectors.toMap(fieldError -> {
                 return fieldError.getField();
             }, fieldMessage -> {
                 return fieldMessage.getDefaultMessage();
             }));

我们把所有的错误字段,对应的错误信息封装为k-v的结构返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值