前言
对待数据校验的时候也需要分情况,如一个实体的id字段,在新建对象存入数据库的时候时不需要设置id的(数据库表中id自增的情况下),所以也不需要接受id的值,这时候我们期望传递过来的id时空的,然而在修改字段的情况下,我们需要根据id进行修改,这时候我们时希望参数里id字段是有效的,然后如果在没做处理的情况下,单独设置了id校验,那么会存在一种情况下时出现校验异常的,这时候就需要引入JSR303提供的分组校验功能
分组校验
在实体类上标注校验注解的时候,可以给groups属性进行赋值,然后在需要校验的controller类的方法中的实体类前加上@Validated注解,先附上代码再细细说明
1)、创建分组
只需要创建两个空的接口用于做标记即可,不需要有内容。
2)、实体类
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 品牌id
* POSTman:{"name":"aaa","logo":"abc","brandId":1}
*/
@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;
/**
* 品牌logo地址 修改可以不带上logoURL
*/
@NotBlank(groups = {AddGroup.class})
@URL(message = "logo必须是一个合法的URL地址", groups={AddGroup.class, UpdateGroup.class})
private String logo;
/**
* 介绍
*/
private String descript;
/**
* 显示状态[0-不显示;1-显示]
*/
@NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})
// @ListValue(vals = {0,1}, groups = {AddGroup.class, UpdateGroup.class, UpdateStatusGroup.class})
private Integer showStatus;
/**
* 检索首字母 修改可以不带, 不管是新增还是修改都必须是一个字母
*/
@NotEmpty(groups = {AddGroup.class})
@Pattern(regexp = "^[a-zA-Z]$", message = "检索首字母必须是一个字母", groups = {AddGroup.class, UpdateGroup.class})
private String firstLetter;
/**
* 排序
*/
@NotNull(groups = {AddGroup.class})
@Min(value = 0, message = "排序必须是一个正整数" , groups = {AddGroup.class, UpdateGroup.class})
private Integer sort;
}
由代码不难看出,每个注解后面我都加上了分组,groups里可以添加多个.class文件,标记对应分组,例如
/**
* 品牌id
* POSTman:{"name":"aaa","logo":"abc","brandId":1}
*/
@NotNull(message = "修改必须定制品牌id", groups = {UpdateGroup.class})
@Null(message = "新增不能指定id", groups = {AddGroup.class})
@TableId
private Long brandId;
这段代码中,@notNull对应了当分组时UpdateGroup的时候,触发该校验,当接收到的brandId字段为空时,就会出现校验异常。@null则对应AddGroup分组。
controller代码
@RequestMapping("/save")
public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand) {
brandService.save(brand);
return R.ok();
}
在需要校验的对象前面加上@Validated({AddGroup.class})表明这个对象要进行数据校验,并且仅对分组时AddGroup的分组进行校验。
特别说明:
JSR303对注释要求相对较为严格,controller类的方法中,需要校验的字段前面可以添加两种注解:
1、@Validated。
对应分组校验,并且仅当对该注解配置分组,实体类也配置分组时才起作用,如果@Validated注解不对它的参数添加分组信息,则默认不校验。一一对应关系十分严格。
2、@Valid。
对应非分组校验,仅当实体类的注释中没有配置分组时才会起作用,如同JSR303参数校验(一)所写代码。