有没有一种方法可以在运行时重用Hibernate的Bean验证实现的就地验证?

时间:2019-03-15 11:21:37

标签: bean-validation hibernate-validator

例如,我有一个课:

@Getter
@Setter
class Notification {

  private String recipient;
  private Channel channel;

  enum Channel {
    SMS, EMAIL
  }
}

我可以定义自己的验证器,例如:

@Target(TYPE)
@Retention(RUNTIME)
@Constraint(validatedBy = {RecipientValidator.class})
@interface ValidRecipient {
  // required arguments of validation annotation
}

class RecipientValidator implements ConstraintValidator<ValidRecipient, Notification> {

  @Override
  public void initialize(ValidRecipient annotation) {
  }

  @Override
  public boolean isValid(Notification value, ConstraintValidatorContext context) {
    boolean result = true;

    if (value.getChannel() == SMS) {
      return matches(value.getRecipient(), "<phone-number-regexp>");
    }

    if (value.getChannel() == EMAIL) {
      // can I reuse Hibernate's Email Validation there?
      return matches(value.getRecipient(), "<email-regexp>");
    }

    return result;
  }
}

我当然可以在电子邮件中搜索regexp并复制粘贴,但是Hibernate的Bean验证实现已经具有电子邮件验证(在@Email注释下)。 有没有办法在我的自定义验证器中重用该验证实现?

1 个答案:

答案 0 :(得分:2)

没有正式的方法可以在另一个验证器中重用验证器。

不过,您可以做的是在EmailValidator中初始化一个initialize()属性,并在您的isValid()方法中调用它的isValid()方法。

请记住,EmailValidator是内部的,因此将来可能会发生变化。