除了hibernate-validator之外的Jersey Bean验证

时间:2017-03-25 05:45:00

标签: java validation jersey-2.0

当我尝试使用jersey验证电子邮件ID时,内置的hibernate-validator无法正确验证其中的字符串 lafalsdf @ ga 会被评估为有效并且它会休息JSR 303老了。我需要根据JSR 311& amp; JSR 339。或者任何其他比hibernate-validator更好的库

如果有图书馆请建议我。我做过研究,却找不到任何研究。

还给我代码在泽西配置它

1 个答案:

答案 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代替@EmailEmailValidator是commons验证器库的一部分。因此,请确保commons-validator.jar位于类路径中。