Java中如何在AbstractValidator中跳过classId验证规则?
几种跳过classId字段验证的方案
方案1:通过条件判断动态启用规则
在classId的验证规则中添加when()条件,根据业务场景的标识决定是否执行验证。比如可以给MyStudent增加一个业务场景标识字段,或者通过外部上下文判断:
public class MyValidator extends AbstractValidator<MyStudent> { public MyValidator() { ruleFor(myStudent -> myStudent.getStudentId()) .must(getStudentId -> CommonValidatorUtils.isValidUUID(getStudentId)) .withMessage("The getStudentId value is invalid"); ruleFor(myStudent -> myStudent.getGradeId()) .must(getGradeId -> !Strings.isNullOrEmpty(getGradeId)) .withMessage("The getGradeId is invalid"); ruleFor(myStudent -> myStudent.getEmail()) .must(CommonValidatorUtils::isEmailValidTemplate) .withMessage("The email is invalid value"); ruleFor(myStudent::getClassId) .must(CommonValidatorUtils::isValidUUID) .withMessage("The getClassId value is invalid.") // 仅当不需要跳过classId验证时执行规则,条件可根据实际业务调整 .when(myStudent -> !myStudent.isSkipClassIdValidation()); } }
使用时,在无需验证classId的业务场景中,给MyStudent对象设置skipClassIdValidation=true即可。
方案2:拆分验证器,按需选择使用
将通用验证规则抽离到基础验证器,再分别创建包含/不包含classId验证的子类,业务场景根据需求选择对应的验证器:
// 基础验证器:包含通用规则 public class BaseStudentValidator extends AbstractValidator<MyStudent> { public BaseStudentValidator() { ruleFor(myStudent -> myStudent.getStudentId()) .must(getStudentId -> CommonValidatorUtils.isValidUUID(getStudentId)) .withMessage("The getStudentId value is invalid"); ruleFor(myStudent -> myStudent.getGradeId()) .must(getGradeId -> !Strings.isNullOrEmpty(getGradeId)) .withMessage("The getGradeId is invalid"); ruleFor(myStudent -> myStudent.getEmail()) .must(CommonValidatorUtils::isEmailValidTemplate) .withMessage("The email is invalid value"); } } // 需要验证classId的场景用这个 public class StudentWithClassIdValidator extends BaseStudentValidator { public StudentWithClassIdValidator() { super(); ruleFor(myStudent::getClassId) .must(CommonValidatorUtils::isValidUUID) .withMessage("The getClassId value is invalid."); } } // 不需要验证classId的场景用这个 public class StudentWithoutClassIdValidator extends BaseStudentValidator { public StudentWithoutClassIdValidator() { super(); // 不添加classId验证规则 } }
方案3:通过构造参数控制规则开关
给验证器添加一个布尔参数,在实例化时决定是否启用classId验证:
public class MyValidator extends AbstractValidator<MyStudent> { public MyValidator(boolean enableClassIdValidation) { ruleFor(myStudent -> myStudent.getStudentId()) .must(getStudentId -> CommonValidatorUtils.isValidUUID(getStudentId)) .withMessage("The getStudentId value is invalid"); ruleFor(myStudent -> myStudent.getGradeId()) .must(getGradeId -> !Strings.isNullOrEmpty(getGradeId)) .withMessage("The getGradeId is invalid"); ruleFor(myStudent -> myStudent.getEmail()) .must(CommonValidatorUtils::isEmailValidTemplate) .withMessage("The email is invalid value"); // 根据传入的开关决定是否添加classId验证规则 if (enableClassIdValidation) { ruleFor(myStudent::getClassId) .must(CommonValidatorUtils::isValidUUID) .withMessage("The getClassId value is invalid."); } } }
使用示例:
// 需要验证classId时 MyValidator validatorWithClassId = new MyValidator(true); // 不需要验证classId时 MyValidator validatorWithoutClassId = new MyValidator(false);
方案4:使用规则分组(Rule Sets)
利用FluentValidation的规则分组功能,将classId验证归类到单独分组,验证时按需指定是否包含该分组:
首先定义分组标识:
public interface ValidateClassIdGroup {}
修改验证器:
public class MyValidator extends AbstractValidator<MyStudent> { public MyValidator() { // 通用规则,默认分组 ruleFor(myStudent -> myStudent.getStudentId()) .must(getStudentId -> CommonValidatorUtils.isValidUUID(getStudentId)) .withMessage("The getStudentId value is invalid"); ruleFor(myStudent -> myStudent.getGradeId()) .must(getGradeId -> !Strings.isNullOrEmpty(getGradeId)) .withMessage("The getGradeId is invalid"); ruleFor(myStudent -> myStudent.getEmail()) .must(CommonValidatorUtils::isEmailValidTemplate) .withMessage("The email is invalid value"); // classId验证规则,指定到自定义分组 ruleFor(myStudent::getClassId) .must(CommonValidatorUtils::isValidUUID) .withMessage("The getClassId value is invalid.") .configure(config -> config.AddGroup(ValidateClassIdGroup.class)); } }
验证时的用法:
MyValidator validator = new MyValidator(); MyStudent student = new MyStudent(); // 仅验证通用规则(跳过classId) ValidationResult resultWithoutClassId = validator.validate(student); // 验证通用规则 + classId规则 ValidationResult resultWithClassId = validator.validate(student, options -> { options.IncludeRuleSets(ValidateClassIdGroup.class); });
内容的提问来源于stack exchange,提问作者Tina
相关产品推荐
相关产品推荐

