交叉字段自定义约束注释不起作用

时间:2013-01-31 08:26:09

标签: hibernate jsf-2 validation bean-validation

我有一个名为ContactTypeName的下拉字段,其中包含电话,电子邮件等值以及名为Contact的输入字段,如果下拉值{{我想验证有效电子邮件地址的输入字段1}}被选中......

<小时/> 我有以下bean

Email

我尝试创建自定义约束,如果@FieldMatch.List({ @FieldMatch(first = "contactDetail", second = "contectTypeName", message = "Please Enter a valid email address") }) public class Contact { private int contactId = 0; @NotNull(message="Please Select a Contact Type") private Integer contectTypeId; private String contectTypeName; @NotNull(message="Please Specify Contact Details") private String contactDetail; } 字段的值为contactDetail

,则会针对电子邮件正则表达式验证contactTypeName字段

我有自定义约束的以下代码

Email

之类的验证器
@Target({TYPE, ANNOTATION_TYPE,METHOD, FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@Documented
public @interface FieldMatch
{
    String message() default "{constraints.fieldmatch}";

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

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

    /**
     * @return The first field
     */
    String first();

    /**
     * @return The second field
     */
    String second();

    /**
     * Defines several <code>@FieldMatch</code> annotations on the same element
     *
     * @see FieldMatch
     */
    @Target({TYPE, ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
            @interface List
    {
        FieldMatch[] value();
    }
}

问题是它没有在表单上触发...即时使用public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object> { private String firstFieldName; private String secondFieldName; private Pattern pattern; private Matcher matcher; private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; @Override public void initialize(final FieldMatch constraintAnnotation) { firstFieldName = constraintAnnotation.first(); secondFieldName = constraintAnnotation.second(); pattern = Pattern.compile(EMAIL_PATTERN); } @Override public boolean isValid(final Object value, final ConstraintValidatorContext context) { try { final Object firstObj = BeanUtils.getProperty(value, firstFieldName);//email address final Object secondObj = BeanUtils.getProperty(value, secondFieldName);//value of the contactType System.out.println((String) firstObj); System.out.println((String) secondObj); if(((String) firstObj == "" || (String) firstObj == null ) && (String) secondObj != "Email"){ return true; }else{ matcher = pattern.matcher((String) firstObj); return matcher.matches(); } //return firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj); } catch (final Exception ignore) { // ignore } return true; } } 模型对话框,其中要呈现要验证的bean

参考:Cross field validation with Hibernate Validator (JSR 303)

期待您的建议和指导

1 个答案:

答案 0 :(得分:0)

JSF 2.0尚不支持交叉字段验证https://hibernate.onjira.com/browse/BVAL-214

使其工作要么使用像seamfaces这样的库,要么手动调用验证,如

    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<Contact>> violations = validator.validate(contact);