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