4

在我的 Spring 应用程序中,我Hibernate Validator用于验证目的。

当我做简单的验证@NotEmpty时,@Email..我很容易工作

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

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

听我的例子...

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

private String fromDateMonth;

private String fromDateYear;

private String toDateMonth;

private String toDateYear;

我在我的 Controller 类中将其转换fromDateMonthfromDateYearDate 。

那么他们是否有可能在 Controller 类中添加验证器注释?

否则我应该听什么?给我建议...

4

3 回答 3

11

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

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

于 2013-05-01T22:42:40.577 回答
1

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

于 2013-05-01T11:48:38.017 回答
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());
    }
}
于 2021-06-02T14:32:08.740 回答