当我尝试使用jersey验证电子邮件ID时,内置的hibernate-validator无法正确验证其中的字符串 lafalsdf @ ga 会被评估为有效并且它会休息JSR 303老了。我需要根据JSR 311& amp; JSR 339。或者任何其他比hibernate-validator更好的库
如果有图书馆请建议我。我做过研究,却找不到任何研究。
还给我代码在泽西配置它
答案 0 :(得分:1)
首先,像 lafalsdf @ ga 这样的emailId根据RFC 822(see here)有效,因为ga
是有效的本地主机名。由于大多数电子邮件验证程序都遵循RFC 822,因此它们也认为它有效。这是Hibernate Validator,Java的本机InternetAddress.validate()
等的情况。但是有Apache Commons Validator项目提供了在执行验证时忽略本地地址的选项。
如果您只关注电子邮件验证,则无需寻找Hibernate Validator的替代品。您可以编写使用Apache commons验证器的自定义注释和验证器,如下所示。
@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
代替@Email
。 EmailValidator
是commons验证器库的一部分。因此,请确保commons-validator.jar位于类路径中。