有没有办法在运行时重用 Hibernate 的 Bean Validation 实现的就地验证?
Is there a way to reuse in place validation of Hibernate's implementation of Bean Validation at runtime?
比如我有一个class:
@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;
}
}
当然我可以 google 电子邮件的正则表达式并复制粘贴到那里,但是 Hibernate 的 Bean 验证实现已经有了电子邮件验证(在 @Email 注释下)。
有没有办法在我的自定义验证器中重用该验证实现?
没有官方方法可以在另一个验证器中重用验证器。
您可以做的是在 initialize()
中初始化一个 EmailValidator
属性并在您的 isValid()
方法中调用它的 isValid()
方法。
请记住,EmailValidator
是内部版本,因此将来可能会发生变化。
比如我有一个class:
@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;
}
}
当然我可以 google 电子邮件的正则表达式并复制粘贴到那里,但是 Hibernate 的 Bean 验证实现已经有了电子邮件验证(在 @Email 注释下)。 有没有办法在我的自定义验证器中重用该验证实现?
没有官方方法可以在另一个验证器中重用验证器。
您可以做的是在 initialize()
中初始化一个 EmailValidator
属性并在您的 isValid()
方法中调用它的 isValid()
方法。
请记住,EmailValidator
是内部版本,因此将来可能会发生变化。