最近看着尚硅谷最新的谷粒商城,学到新的知识,就是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中的值。