在我的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;
我将此fromDateMonth
和fromDateYear
转换为此控制器类中的日期。
他们是否可以在Controller类中添加Validator Annotation?
其他明智的我应该听到什么?给我建议......
答案 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());
}
}