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

Jav*_*per 4 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;
Run Code Online (Sandbox Code Playgroud)

我正在转换这fromDateMonthfromDateYear成这是我的控制器类Date.

那么他们在Controller类中添加Validator Annotation的任何可能性是什么?

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

kev*_*847 9

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

有关更多信息,请参阅以下答案.


M. *_*dek 5

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

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

class MyDto {

    @ValidDateRange // <-- target annotation
    private DateRange dateRange;
    
    // getters, setters, etc.
}
Run Code Online (Sandbox Code Playgroud)
class DateRange {

    private LocalDate startOfRange;
    private LocalDate endOfRange;

    // getters, setters, etc.
}
Run Code Online (Sandbox Code Playgroud)

现在,我们可以声明我们自己的@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 { };
}
Run Code Online (Sandbox Code Playgroud)

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

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