展开
拓展 关闭
订阅号推广码
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 @ 2022-10-07 18:42  DogLeftover  阅读(116)  评论(0)    收藏  举报