Search code examples
annotationsbean-validationhibernate-validator

Multiple validation options in Annotation


My question is a branch of of this one.

I have a Annotation (say phone annotation) that I want to validate. I can use @phone validator to check if a phone object is valid or not. I want to also be able to place this validator on a contact information object that contains a phone. Is there a way to use multiple validators for one annotation so I can use @phone for my phone object and my contact information object?

Would something like
@Constraint(validatedBy = {PhoneIsValid.class, PhoneIsValid2.class})
work? (The idea being one Validator handles the phone object and the other handles the contact information object.)


Solution

  • It is possible to have multiple validators for the same annotation type. As you mentioned, you have define all of them in the @Constraint annotation.

    Annotaion:

    @Documented
    @Target({ ElementType.ANNOTATION_TYPE, ElementType.FIELD })
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = { ValidPhonePhoneValidator.class, ValidPhoneContactValidator.class })
    public @interface ValidPhone {
    
      String message() default "";
      Class<?>[] groups() default { };
      Class<? extends Payload>[] payload() default { };
    } 
    

    Validator1:

    public class ValidPhonePhoneValidator implements ConstraintValidator<ValidPhone, Phone> { ... }
    

    Validator2:

    public class ValidPhoneContactValidator implements ConstraintValidator<ValidPhone, Contact> { ... }