我已经使用 GroupSequence 实现了有序验证,但一般来说,GroupSequence bean 验证实现是不透明的。
意思是,在第一组完全验证之前,您不能触发第二组的验证。
例如
我有 3 个带有自定义验证器的验证字段。这个想法非常简单:每个字段都应该使用一组验证器从上到下独立验证(降序基数)。
@StringPropertyNotNullOrEmptyConstraint(message = "Group name is required", groups = {ValidationStep1.class})
private final StringProperty groupName;
@StringPropertyNotNullOrEmptyConstraint(message = "Group password is required", groups = {ValidationStep1.class})
@StringPropertyMatchConstraint(message = "The given password phrases do not match", dependentProperties = {"groupPasswordMatch"}, groups = {ValidationStep2.class})
private final StringProperty groupPassword;
@StringPropertyNotNullOrEmptyConstraint(message = "Group password match is required", groups = {ValidationStep1.class})
@StringPropertyMatchConstraint(message = "The given passwords phrases do not match", dependentProperties = {"groupPassword"}, groups = {ValidationStep2.class})
private final StringProperty groupPasswordMatch;
public interface ValidationStep1 {
}
public interface ValidationStep2 {
}
@GroupSequence({GroupDialogModel.class, ValidationStep1.class, ValidationStep2.class})
public interface GroupDialogModelValidationSequence {
}
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
Set<ConstraintViolation<GroupDialogModel>> constraintViolations = validator.validate(this, GroupDialogModelValidationSequence.class);
这种方法的注意事项是每个字段都应该首先通过 ValidationStep1,只有在第 1 步的每次验证成功后才会进入第 2 步。例如,即使密码字段不是空的,而是包含不同的值,如果它们的验证成功,如果组名字段不包含任何值。只有在我为组名输入一些值后,ValidationStep1 组才成功,然后它显示 ValidationStep2 的验证结果(密码不匹配)。
恕我直言,为每个序列中的每个字段制作每个组是不好的做法,但似乎别无选择。
非常感谢任何其他解决方案。