2013-01-31 3 views
0

У меня есть выпадающее поле с именем ContactTypeName, которое имеет такие значения, как телефон, электронная почта и т. Д. И поле ввода с именем Contact. Я хочу проверить поле ввода для действительного адреса электронной почты, если выбрано выпадающее значение Email ...Cross Field Пользовательское ограничение аннотации не работает


я следующий боб

@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; 
    } 
} 

проблемой является то, что его не стрелять в виде поста. .. im с использованием диалоговое окно модели, в котором обрабатывается компонент, подлежащий проверке

REF: Cross field validation with Hibernate Validator (JSR 303)

с нетерпением жду ваших предложений и рекомендаций

ответ

0

JSF 2.0 не поддерживает проверку поперечного поля еще https://hibernate.onjira.com/browse/BVAL-214

, чтобы заставить его работать либо использовать библиотеку как seamfaces или вызвать проверку вручную, как

Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
    Set<ConstraintViolation<Contact>> violations = validator.validate(contact); 
Смежные вопросы