У меня есть выпадающее поле с именем 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)
с нетерпением жду ваших предложений и рекомендаций