【问题标题】:Spring Validation Between Two Date Fields?两个日期字段之间的春季验证?
【发布时间】:2013-05-01 11:22:18
【问题描述】:

在我的 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 类中将此 fromDateMonthfromDateYear 转换为 Date。

那么他们有没有可能在 Controller 类中添加验证器注解?

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

【问题讨论】:

    标签: java spring hibernate-validator spring-validator


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • if type 是 Date ... 很简单,但问题是我的 jsp 有两个选择框 es,一个是月份,一个是年份 .. 所以这就是我采用字符串的方式......
      • 在我的控制器类中,首先比较两个日期,如果 fromdate 大于 totodate .. 我将错误添加到 BindingResult 对象但如何添加以及在 Bean 类中添加哪个注释?跨度>
      • 如果您在模型中使用 Date 对象,然后在 JSF 中使用日期字段,可能会更简单,您将能够直接在模型中使用注释并测试日期是否在今天之前或之后(如果我能很好地理解您的最后评论),带有 @Past@Future 注释
      【解决方案3】:

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

      假设我们有一个 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());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-29
        • 2015-04-19
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多