I am attempting to validate String Date using javax.validation
& Hibernate validation. i need to check given String date should be past and it should be correct yyyyMMdd
format with all constraints like leap year, 30th
, 31st
day.
public class UserInformation {
@NotNull
public String idNum = null;
@NotNull
//@Past
@Pattern(regexp="\\d{4}(1[012]|0[1-9])(3[01]|[12]\\d|0[0-9])")
public String dob= null;
}
I tried with this code but not working. Is there any solution. if we have custom validator then is it in field level.Please give suggestion or code snippet.
Change your pattern to this:
Pattern(regexp = "([0-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/[0-9]{4}")
But keep in mind that this kind of validation is not checking if February has less than 28/29 days, and other dates constraints.
Create your custom constraint validator
Annotation
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = CheckDateValidator.class)
@Documented
public @interface CheckDateFormat {
String message() default "{message.key}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
String pattern();
}
Validator class
Having the Date object you can do any other validation you want (like refuse dates in the past)
public class CheckDateValidator implements ConstraintValidator<CheckDateFormat, String> {
private String pattern;
@Override
public void initialize(CheckDateFormat constraintAnnotation) {
this.pattern = constraintAnnotation.pattern();
}
@Override
public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
if ( object == null ) {
return true;
}
try {
Date date = new SimpleDateFormat(pattern).parse(object);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
Use
@CheckDateFormat(pattern = "ddMMyyyy")
private String value;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With