6

In my Spring Application, i'm Using Hibernate Validator for Validation Purpose.

When i'm doing simple Validation like @NotEmpty, @Email .. i'm easily working

But When coming to Date field, giving Problem...

Problem is in my Jsp page i'm getting values type as String then i'm convert String to Date..

Hear is my Example...

@NotEmpty(message = "Write Some Description")
private String description;

private String fromDateMonth;

private String fromDateYear;

private String toDateMonth;

private String toDateYear;

i'm converting this fromDateMonth and fromDateYear into Date in this my Controller class.

So is their any Possibility to add Validator Annotation in Controller class?

Other wise what should i'm do hear? give me suggestions...

Java Developer
  • 1,873
  • 8
  • 32
  • 63

3 Answers3

14

If you want to validate that fromDate is before toDate, you can write a custom validator to perform this multi-field validation. You write a custom validator, and you also define a custom annotation which is placed on the bean being validated.

See the following answers for more information.

Community
  • 1
  • 1
kevin847
  • 1,058
  • 1
  • 7
  • 15
4

Based on the number of times the question is displayed, I conclude that a lot of people still end up here looking for a validator for a date range.

Suppose we have a DTO containing another DTO (or class with @Embeddable annotation) with two fields with LocalDate (or other date representation, it's only example).

class MyDto {

    @ValidDateRange // <-- target annotation
    private DateRange dateRange;
    
    // getters, setters, etc.
}
class DateRange {

    private LocalDate startOfRange;
    private LocalDate endOfRange;

    // getters, setters, etc.
}

Now, we can declare our own @ValidDateRange annotation:

@Documented
@Constraint(validatedBy = DateRangeValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface ValidDateRange {

    String message() default "Start date must be before end date";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}

Writing the validator itself also comes down to a few lines of code:

class DateRangeValidator implements ConstraintValidator<ValidDateRange, DateRange> {
    @Override
    public boolean isValid(DateRange value, ConstraintValidatorContext context) {
        return value.getStartOfRange().isBefore(value.getEndOfRange());
    }
}
M. Dudek
  • 978
  • 7
  • 28
1

For sure you can use Bean Validation inside your controller, just add an annotation on the property like you did in your model. But the best way would be use a Date type in your model instead of string.

Romain R
  • 41
  • 4
  • if type is Date ... So simple but Problem is my jsp has two select box es and one is for month and one is for Year .. so that's way i'm taking Strings... – Java Developer May 01 '13 at 11:55
  • In my controller class, first compare Two Dates, if fromdate is greater than to todate .. i'm add error to BindingResult object but how to add and in Bean class which annotation will add? – Java Developer May 01 '13 at 11:58
  • It might be more simple if you use a Date object in your model, then use a date field in your JSF, you'll be able to use the annotations directly inside your model and test if the date is before or after today (if I understood well your last comment) with the `@Past` or `@Future` annotations – Romain R May 01 '13 at 12:06