如何通过反射或任何其他方式手动触发Javax验证?

Vel*_*aga 3 java validation spring hibernate-validator bean-validation

我正在使用validation-api-2.0.1.Finalhibernate-validator-6.0.13.Final。我想对以下情况进行验证,

我创建了一个自定义验证来验证 List<Map<String,Object>>

BookInfo.java

@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {BookInfoValidator.class}
)
public @interface BookInfo {
    String message() default "Should not be empty";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
Run Code Online (Sandbox Code Playgroud)

BookInfoValidator.java

public class BookInfoValidator implements ConstraintValidator<ValidateUserInfo, List<Map<String, Object>>> {

    private final ContentRepositoryClient contentRepository;

    public ValidateUserInfoValidator(ContentRepositoryClient contentRepository) {
        this.contentRepository = contentRepository;
    }

    @Override
    public void initialize(ValidateUserInfo constraintAnnotation) {

    }

    @Override
    public boolean isValid(List<Map<String,Object>> map, ConstraintValidatorContext constraintValidatorContext) {
        //In the list of Map the key will be "text,email,date etc etc" based on the key i would like to
        //validate with the proper validation constraints
        //ex) for Email invoke javax.validation.constraints.Email.class from validation-api
        //I am not sure how to manually invoke the validation annotations.
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

BookInfoView.java

class BookInfoView {
        @BookInfo
        private List<Map<String, Object>> bookInfos;
    }
Run Code Online (Sandbox Code Playgroud)

在地图列表中,键为“文本,电子邮件,日期等”。基于密钥,我想使用javax.validation.constraints.Email.class来自validation-api的电子邮件调用的适当验证约束例外进行验证。我不确定如何手动调用验证批注。

任何提示或帮助将不胜感激。

Atu*_*edi 6

我不确定如何手动调用验证批注。

我在上面引用的行中回答。是的,可以以编程方式调用验证,如果验证失败,您将收到一组中的所有失败消息。以下是执行相同操作的步骤:

  1. 建立 ValidatorFactory
  2. 从以下位置获取Validator实例ValidatorFactory
  3. 使用validate()方法执行验证
  4. 处理验证结果 constraintViolations.iterator().next().getMessage()

显示一些代码,下面是上述所有四个步骤的代码片段:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<BookInfoView>> constraintViolations = validator.validate(bookInfoViewObj);
assertEquals( "Should not be empty", constraintViolations.iterator().next().getMessage() );
Run Code Online (Sandbox Code Playgroud)

Hibernate Validator框架提供了各种其他功能来验证一个或多个实体,然后处理结果。更好的是你看了官方文件