Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java String Date Validation Using Hibernate API

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.

like image 911
deadend Avatar asked Jan 18 '17 11:01

deadend


1 Answers

Option 1

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.

Options 2

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;
like image 90
Rafael Teles Avatar answered Sep 18 '22 13:09

Rafael Teles