Cross Field custom constraint annotation not working

I have a drop-down field called ContactTypeName that has values ​​like phone, email, etc., and an input field called Contact . I want to check the input field for a valid email address if the Email dropdown is selected ...

<h / "> I have the next bean

 @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 trying to create a custom constraint that will check the contactDetail field against an email regular expression if the ContactTypeName field is ContactTypeName to Email

I have the following code for user restriction

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

and validator like

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

the problem is that it does not run the post ... im form using the Prime Faces model dialog where the bean check is performed

REF: Cross Field Validation with Hibernate Validator (JSR 303)

I look forward to your suggestions and recommendations

0
source share
1 answer

JSF 2.0 does not yet support cross-field validation https://hibernate.onjira.com/browse/BVAL-214

to make it work either with a library, for example with seamfaces , or call a manual check, for example

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

All Articles