自定义类级别 bean 验证约束

Ank*_*gam 7 constraints bean-validation class-level

我已经知道如何在实体类中的特定属性上添加基于注释的验证,例如:-

public class Person {

    @NotNull
    private String firstName;

    private String lastName;

    //...
}
Run Code Online (Sandbox Code Playgroud)

但是是否可以在类 Person 上添加注释,以便通过创建自定义验证类并在某处处理验证来验证该类中的所有属性,例如:-

@Retention(value = RetentionPolicy.RUNTIME)      
@Target(value = ElementType.METHOD)
public @interface PersonneName {
public String firstName();
}
Run Code Online (Sandbox Code Playgroud)

我正在开发一个项目,从数据库获取约束并创建自定义验证类,并根据从数据库获取的约束应用于实体类属性。请建议。

Mat*_*att 5

是的,当然,这是可能的。首先,创建注释的定义。与您在示例中所做的非常相似,但是使用了不同的@Target类型

@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PersonValidator.class)    
public @interface ValidPerson {
    String message () default "Your custom message";
    Class<?>[] groups () default {};
    Class<? extends Payload>[] payload () default {};
}
Run Code Online (Sandbox Code Playgroud)

然后实现验证器,其isValid方法采用 Person 类的实例:

 public class PersonValidator implements ConstraintValidator<ValidPerson, Person> {
  
    @Override
    public boolean isValid (Person person, ConstraintValidatorContext context) {
        // your validation logic
    }
}
Run Code Online (Sandbox Code Playgroud)


Har*_*rdy 1

当然这是可能的,只需检查有关如何编写自定义类级别约束的文档 - http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-class-level-constraints

当然,重要的是您确保可以实际将约束注释放置在类型级别上。为此,您需要添加ElementType.TYPE到注释中@Target