The @ValidateDateRange is a class-level constraint annotation that will validate a date range represented by two java.util.Date properties of an object. This can be reused in any class.
@ValidateDateRange(start="startDate", end="endDate") public class MyEntity { private Date startDate; private Date endDate; ... }
The annotation definition are as follows:
package blogspot.soadev.validator; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import java.util.Date; import javax.validation.Constraint; import javax.validation.ConstraintPayload; @Target( { TYPE, ANNOTATION_TYPE }) @Retention(RUNTIME) @Constraint(validatedBy = {DateRangeValidator.class} ) @Documented public @interface ValidateDateRange { String message() default "{end} should be later than {start}"; String start(); String end(); Class[] groups() default {}; Class[] payload() default {}; }And the implementing DateRangeValidator are as follows:
package blogspot.soadev.validator; import java.lang.reflect.Field; import java.util.Date; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class DateRangeValidator implements ConstraintValidator{ private String start; private String end; public void initialize(ValidateDateRange validateDateRange) { start = validateDateRange.start(); end = validateDateRange.end(); } public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) { try { Class clazz = object.getClass(); Date startDate = null; Method startGetter = clazz.getMethod(getAccessorMethodName(start), new Class[0]); Object startGetterResult = startGetter.invoke(object, null); if (startGetterResult != null && startGetterResult instanceof Date){ startDate = (Date) startGetterResult; }else{ return false; } Date endDate = null; Method endGetter = clazz.getMethod(getAccessorMethodName(end), new Class[0]); Object endGetterResult = endGetter.invoke(object, null); if (endGetterResult == null){ return true; } if (endGetterResult instanceof Date){ endDate = (Date) endGetterResult; } return (startDate.before(endDate)); } catch (Throwable e) { System.err.println(e); } return false; } private String getAccessorMethodName(String property){ StringBuilder builder = new StringBuilder("get"); builder.append(Character.toUpperCase(property.charAt(0))); builder.append(property.substring(1)); return builder.toString(); } }
Related Posts
- JSR 303 Bean Validation: @AssertMethodAsTrue - A reusable constraint annotation that spans multiple properties.
- JSR 303 Bean Validation: Error "java.lang.NoSuchMethodError: javax.persistence.Persistence.getPersistenceUtil()Ljavax/persistence/PersistenceUtil;"
- Integrating JSR 303 Bean Validation with Oracle ADF 11g
Cheers!