展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

分组校验、级联校验、自定义验证规则

  • 分组校验
# 实体类
# 所有的属性都是默认分组
public class UserInfo {
// 标记接口,新增组
public interface Add{
}
public interface Update{
}
// 默认的组 : javax.validation.groups.Default
@Null(groups = {Add.class}) // 只适用于新增
@NotNull(groups = Update.class) // 只适用于修改
private Long id;
}
# 传入参数groups
public class ValidationUtil {
// 线程安全
private static Validator validator;
static {
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
public static List<String> valid(UserInfo userInfo, Class<?>... groups){
// 如果被校验对象userInfo没有校验通过,则set里面就有校验信息
Set<ConstraintViolation<UserInfo>> set = validator.validate(userInfo,groups);
List<String> list = set.stream().map(v -> "属性:" + v.getPropertyPath() +
",属性的值:"
+ v.getInvalidValue() + ",校验不通过的提示信息:" + v.getMessage())
.collect(Collectors.toList());
return list;
}
}
# 测试
public class ValidationTest {
public static void main(String[] args) {
UserInfo userInfo = new UserInfo();
userInfo.setName("zhaodaowen");
userInfo.setAge(18);
userInfo.setEmail("2025186764@qq.com");
userInfo.setPhone("13312345678");
userInfo.setBirthDay(LocalDateTime.now().minusDays(1));
userInfo.setPersonalPage("http://www.roadjava.com");
// 新增操作时
List<String> list = ValidationUtil.valid(userInfo,UserInfo.Add.class,Default.class);
System.out.print(list);
}
}
  • 级联校验
# 第1个实体类
public class Grade {
@NotBlank
private String no;
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
}
# 第2个实体类
public class UserInfo {
@NotNull
@Valid // 被引用对象加@Valid注解才可以完成级联校验
private Grade grade;
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
  • 自定义验证规则
@Documented
@Constraint(validatedBy = { UserStatusValidator.class}) // 说明当前注解要被谁来完成校验工作
@Target({ FIELD})
@Retention(RUNTIME)
public @interface UserStatus {
String message() default "status必须是1000/1001/1002";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
public class UserStatusValidator implements ConstraintValidator<UserStatus, Integer> {
@Override
public void initialize(UserStatus constraintAnnotation) {
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
if ( value == null ) {
return true;
}
Set<Integer> set = new HashSet<>();
set.add(1000);
set.add(1001);
set.add(1002);
return set.contains(value);
}
}
# 测试
public class UserInfo {
@UserStatus
private Integer status;
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
posted @   DogLeftover  阅读(110)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示