【问题标题】:Jersey Bean validation other than hibernate-validator除了 hibernate-validator 之外的 Jersey Bean 验证
【发布时间】:2017-03-25 05:44:59
【问题描述】:
当我尝试使用 jersey 验证电子邮件 ID 时,内置的 hibernate-validator 没有正确验证它,休闲字符串 lafalsdf@ga 被评估为有效并且它休耕JSR 303 是旧的。我需要根据 JSR 311 和 JSR 339 验证的库。或者任何其他比 hibernate-validator 更好的库
如果有任何图书馆,请建议我。我已经进行了研究,但找不到任何东西。
并且还给我代码在球衣中配置它
【问题讨论】:
标签:
java
validation
jersey-2.0
【解决方案1】:
首先,像 lafalsdf@ga 这样的 emailId 根据 RFC 822 (see here) 是有效的,因为 ga 是有效的本地主机名。由于大多数电子邮件验证器都遵循 RFC 822,因此他们也认为它是有效的。 Hibernate Validator、Java 的原生 InternetAddress.validate() 等就是这种情况。但是,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 代替@Email。 EmailValidator 是公共验证器库的一部分。因此,请确保 commons-validator.jar 在您的类路径中。