hibernate-validator 以外的 Jersey Bean 验证

Jersey Bean validation other than hibernate-validator

当我尝试使用球衣验证电子邮件 ID 时,内置的 hibernate-validator 没有正确验证休假字符串 lafalsdf@ga 被评估为有效,它休假了旧的 JSR 303。我需要根据 JSR 311 和 JSR 339 验证的库。或者任何其他比 hibernate-validator

更好的库

如果有任何图书馆请推荐我。我做了研究,但找不到任何东西。

并给我在 jersey 中配置它的代码

首先,像 lafalsdf@ga 这样的电子邮件 ID 根据 RFC 822 是有效的(see here) because ga is a valid local host name. Since most of the email validators follow RFC 822, they too consider it valid. This is the case for Hibernate Validator,Java's native InternetAddress.validate() etc. However there is Apache Commons Validator 项目提供了在执行验证时忽略本地地址的选项.

如果您只关心电子邮件验证,则不必寻找 Hibernate Validator 的替代品。您可以编写使用 Apache 公共验证器的自定义注释和验证器,如下所示。

@Constraint(validatedBy = CommonsEmailValidator.class)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
public @interface CommonsEmail {
String message() default "{org.hibernate.validator.constraints.Email.message}";

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

Class<? extends Payload>[] payload() default {};

/**
 * Defines several {@code @Email} annotations on the same element.
 */
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
public @interface List {
    CommonsEmail[] value();
}

public static class CommonsEmailValidator implements ConstraintValidator<CommonsEmail, CharSequence> {

    @Override
    public void initialize(CommonsEmail annotation) {
    }

    @Override
    public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
        return EmailValidator.getInstance(false).isValid(value.toString());
    }

  }
}

现在,您可以使用新的 @CommonsEmail 而不是 @EmailEmailValidator 是公共验证程序库的一部分。所以确保 commons-validator.jar 在你的类路径中。