两个日期字段之间的弹簧验证?

时间:2013-05-01 11:22:18

标签: java spring hibernate-validator spring-validator

在我的Spring应用程序中,我正在使用Hibernate Validator进行验证。

当我进行简单的验证时,如@NotEmpty@Email ..我很容易就可以了

但是当来到Date字段时,给出问题......

问题出在我的Jsp页面中我得到的值类型为String然后我将String转换为Date ..

听到我的例子......

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

private String fromDateMonth;

private String fromDateYear;

private String toDateMonth;

private String toDateYear;

我将此fromDateMonthfromDateYear转换为此控制器类中的日期。

他们是否可以在Controller类中添加Validator Annotation?

其他明智的我应该听到什么?给我建议......

3 个答案:

答案 0 :(得分:8)

如果要验证fromDate是否在toDate之前,您可以编写自定义验证器来执行此多字段验证。您编写了一个自定义验证器,并且还定义了一个自定义注释,该注释放置在要验证的bean上。

有关详细信息,请参阅以下答案。

答案 1 :(得分:1)

当然,您可以在控制器中使用Bean Validation,只需在属性中添加注释,就像在模型中一样。 但最好的方法是在模型中使用Date类型而不是字符串。

答案 2 :(得分:1)

根据问题显示的次数,我得出的结论是,很多人最终还是会在这里寻找日期范围的验证器。

假设我们有一个 DTO,其中包含另一个 DTO(或带有 @Embeddable 注释的类),其中两个字段带有 LocalDate(或其他日期表示,这只是示例)。

class MyDto {

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

    private LocalDate startOfRange;
    private LocalDate endOfRange;

    // getters, setters, etc.
}

现在,我们可以声明我们自己的 @ValidDateRange 注释:

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

编写验证器本身也归结为几行代码:

class DateRangeValidator implements ConstraintValidator<ValidDateRange, DateRange> {
    @Override
    public boolean isValid(DateRange value, ConstraintValidatorContext context) {
        return value.getStartOfRange().isBefore(value.getEndOfRange());
    }
}