【问题标题】:Trouble returning value in custom Spring Validator在自定义 Spring Validator 中无法返回值
【发布时间】:2017-05-09 11:57:19
【问题描述】:

鉴于下面的 try/catch 块,我如何在实际方法范围内返回 return !dateToDate.before(dateFromDate) && dateFromDate.before(dateToDate); 值?它要我返回假。我无法在我想要的位置包含正确的返回值,即 return false 当前所在的位置。

public class YourDateValidator implements ConstraintValidator<ValidDates,
        TypeToBeValidated> {

    @Override
    public void initialize(ValidDates constraintAnnotation) {

    }

    @Override
    public boolean isValid(TypeToBeValidated value, ConstraintValidatorContext context) {
        String dateTo = value.getDateTo();
        String dateFrom = value.getDateFrom();

        SimpleDateFormat formatter = new SimpleDateFormat(DateUtil.dateFormat);
        Date dateToDate = null;
        Date dateFromDate = null;
        try {
            dateFromDate = formatter.parse(dateFrom);
            dateToDate = formatter.parse(dateTo);
            return !dateToDate.before(dateFromDate) && dateFromDate.before(dateToDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return false;
    }

}

所需代码:

@Override
    public boolean isValid(TypeToBeValidated value, ConstraintValidatorContext context) {
        String dateTo = value.getDateTo();
        String dateFrom = value.getDateFrom();

        SimpleDateFormat formatter = new SimpleDateFormat(DateUtil.dateFormat);
        Date dateFromDate = formatter.parse(dateFrom);
        Date dateToDate = formatter.parse(dateTo);
        return !dateToDate.before(dateFromDate) && dateFromDate.before(dateToDate);
    }

我不能在 @Overriden isValid 类中抛出 ParseException。但是我不能将返回值放在格式化程序的 try/catch 块中。我该怎么办?

【问题讨论】:

    标签: java spring validation date spring-boot


    【解决方案1】:

    由于您必须捕获已检查的异常,因此无法实现您想要的实现。如果您的目标是该方法只有一个返回点,那么您可以使用在 try/catch 块中分配的结果变量:

    @Override
    public boolean isValid(TypeToBeValidated value, ConstraintValidatorContext context) {
        String dateTo = value.getDateTo();
        String dateFrom = value.getDateFrom();
    
        SimpleDateFormat formatter = new SimpleDateFormat(DateUtil.dateFormat);
        Date dateToDate = null;
        Date dateFromDate = null;
        boolean valid = false;
        try {
            dateFromDate = formatter.parse(dateFrom);
            dateToDate = formatter.parse(dateTo);
            valid = !dateToDate.before(dateFromDate) && dateFromDate.before(dateToDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    
        return valid;
    }
    

    或者,如果你真的想在方法之外处理异常,你可以将它作为未经检查的异常重新抛出:

    @Override
    public boolean isValid(TypeToBeValidated value, ConstraintValidatorContext context) {
        String dateTo = value.getDateTo();
        String dateFrom = value.getDateFrom();
    
        SimpleDateFormat formatter = new SimpleDateFormat(DateUtil.dateFormat);
        Date dateToDate = null;
        Date dateFromDate = null;
        try {
            dateFromDate = formatter.parse(dateFrom);
            dateToDate = formatter.parse(dateTo);
            return !dateToDate.before(dateFromDate) && dateFromDate.before(dateToDate);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
    

    【讨论】:

      【解决方案2】:

      我建议你总是使用这样的东西:

      @Override
      public boolean isValid(TypeToBeValidated value, ConstraintValidatorContext context) {
          String dateTo = value.getDateTo();
          String dateFrom = value.getDateFrom();
      
          SimpleDateFormat formatter = new SimpleDateFormat(DateUtil.dateFormat);
          boolean isValid = false;
          try {
              Date dateFromDate = formatter.parse(dateFrom);
              Date dateToDate = formatter.parse(dateTo);
              isValid = dateFromDate.before(dateToDate);
              if( isValid ) {
                  return true;
              }
      
              context.buildConstraintViolationWithTemplate(
                      String.format("Error: dateFromDate (%s) is not before dateToDate (%s)!", 
                          dateFromDate.toString(), 
                          dateToDate.toString()
                      )
                  )
                  .addConstraintViolation();
              }
          } catch (ParseException e) {
              context.buildConstraintViolationWithTemplate(
                      String.format("Exception while validating dateFromDate (%s), dateToDate (%s)! Reason: %s", 
                          dateFromDate.toString(), 
                          dateToDate.toString(), 
                          e.getMessage()
                      )
                  )
                  .addConstraintViolation();
          }
      
          return false;
      }
      

      在这种情况下,您将始终知道验证失败的原因和数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        相关资源
        最近更新 更多