2013-01-31 3 views
0

J'ai un champ déroulant nommé ContactTypeName qui ont les valeurs comme téléphone, email etc. et un champ de saisie nommé Contact Je veux valider le champ de saisie pour l'adresse e-mail valide si la valeur de la liste déroulante Email est sélectionnée ...Cross Field Annotation de contrainte personnalisée ne fonctionnant pas


j'ai le haricot suivant

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

im essayant de créer une contrainte personnalisée qui validera le champ contactDetail contre un email regex si le contactTypeName champ aura la valeur Email

j'ai le code suivant pour la contrainte personnalisée

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

et le validateur comme

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

le problème est que son pas de tir sur le poteau de forme. .. im en utilisant Prime Faces boîte de dialogue modèle dans lequel le haricot à valider est rendu

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

avec impatience vos suggestions et conseils

Répondre

0

JSF 2.0 ne prend pas en charge la validation sur le terrain croix encore https://hibernate.onjira.com/browse/BVAL-214

pour le faire fonctionner soit utiliser une bibliothèque comme seamfaces ou appelez la validation manuelle comme

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