【问题标题】:How to validate that date in future in reference to another date?如何在将来参考另一个日期验证该日期?
【发布时间】:2022-01-18 23:29:55
【问题描述】:

我有以下 bean:

class CampaignBeanDto {

    @Future
    Date startDate;

    Date endDate;

    ...
}

显然我认为endDate 应该在 startDate 之后。我要验证它。

我知道我可以手动实现 @FutureAfterDate 的注释,验证器并手动初始化阈值日期,但我想使用 @Validated spring mvc 注释。

我怎样才能实现它?

【问题讨论】:

    标签: java validation date spring-mvc hibernate-validator


    【解决方案1】:

    你将不得不忍受并给自己写一个验证器。

    这应该让你开始:

    Cross field validation with Hibernate Validator (JSR 303)

    【讨论】:

    • 问题 startDate 只能在运行时知道。还是你提供使用反射来获取 startDate 值?
    • 验证传递注释字段仅用于验证。我知道 endDate 值,我怎么知道 startDate 值?
    • @gstackoverflow 遵循我链接到的示例。我的 sn-p 错了,我删除了它
    【解决方案2】:

    您不应该使用 Annotations 进行跨字段验证,而是编写一个验证函数。在this Answer 中对问题Cross field validation with Hibernate Validator (JSR 303) 进行了解释。

    例如编写一个这样的验证器函数:

    public class IncomingData {
    
      @FutureOrPresent
      private Instant startTime;
    
      @Future
      private Instant endTime;
    
      public Boolean validate() {
          return startTime.isBefore(endTime);
      }
    }
    

    然后在第一次接收数据时简单地调用验证器函数:

    if (Boolean.FALSE.equals(incomingData.validate())) {
      response = ResponseEntity.status(422).body(UNPROCESSABLE);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 2019-04-02
      相关资源
      最近更新 更多