validate的使用,同一实体分组校验 ValidatorFactory
文章目录
- 前言
- 一、举个例子
- 二、使用步骤
- 1.引入依赖
- 2. 加入分组标识
- 3. 分组校验应用
- 1. 明确知道当前接口方法(新增/修改)
- 2. 不明确当前接口方法(修改增加为同一个接口)
- 总结
前言
实际开发中遇到这样一个问题,一个接收参数的实体类,作为修改和新增的接口的入参,但是主键在新增中不是必传的,在修改中是必传的,那么如何用validation 校验呢?
一、举个例子
我有实体类如下:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BasicArea {
private String id;
/**
* 区域名称
*/
private String name;
/**
* 区域备注
*/
private String remark;
/**
* 父级区域id
*/
@NotNull(message = "不能为null")
private String parentId;
/**
* 所有父级区域id
*/
@Min(value=3,message = "长度最小值为3")
@Max(value=30,message = "长度最大值为30")
private String path;
/**
* 区域层级
*/
private Integer depth;
/**
* 扩展属性
*/
private String extend;
/**
* 排序号
*/
private Integer sort;
}
即是修改入参,也是新增入参;现在要分别校验,我们采用分组校验的方式
二、使用步骤
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.4.3</version>
</dependency>
2. 加入分组标识
增加后的实体
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BasicArea {
@NotBlank(groups={update.class})
private String id;
/**
* 区域名称
*/
private String name;
/**
* 区域备注
*/
private String remark;
/**
* 父级区域id
*/
@NotNull(message = "不能为null")
private String parentId;
/**
* 所有父级区域id
*/
@Min(value=3,message = "长度最小值为3",groups = {add.class})
@Max(value=30,message = "长度最大值为30")
private String path;
/**
* 区域层级
*/
private Integer depth;
/**
* 扩展属性
*/
private String extend;
/**
* 排序号
*/
private Integer sort;
public interface add{
}
public interface update{
}
}
3. 分组校验应用
1. 明确知道当前接口方法(新增/修改)
改造controller即可,例如我知道当前为修改接口
@RequestMapping("/validate")
public Object validate(@RequestBody @Validated(BasicArea.update.class)BasicArea basicArea){
return "SUCCESS";
}
@Validated 开启校验
BasicArea.update.class 开启分组校验,只有分组是 update的时候,才会校验,其他不加分组的字段,正常校验
本文中: id 在此处会做@NotBlank的判断
2. 不明确当前接口方法(修改增加为同一个接口)
需要通过判断当前是新增还是修改,改造如下; 新增同理
@Autowired
private ValidatorFactory validatorFactory;
@RequestMapping("/validate")
public Object validate(@RequestBody BasicArea basicArea) {
Set<ConstraintViolation<BasicArea>> validate = validatorFactory.getValidator().validate(basicArea, BasicArea.update.class);
for (ConstraintViolation<BasicArea> basicAreaConstraintViolation : validate) {
System.out.println(basicAreaConstraintViolation.getPropertyPath() + basicAreaConstraintViolation.getMessage() + basicAreaConstraintViolation.getInvalidValue());
}
return "SUCCESS";
}
例如经过判断为修改,通过此种方式校验;
如Set<ConstraintViolation> validate集合不为空,则校验不通过;
总结
以上就是Validate中的分组校验,能达到相对复杂的业务校验逻辑,也无需创建多余的实体入参类了,分组校验,逼格更高~~
快来试试吧!!