【问题标题】:Using javax.validation validate the date must not be less than 1900-01-01使用 javax.validation 验证日期不得小于 1900-01-01
【发布时间】:2019-06-12 22:34:47
【问题描述】:

我有一个类作为我的 api 的请求有效负载。我需要验证我的字段“dateOfBirth”之一。使用 javax.validation.past 我正在检查日期不是未来日期,但我还想验证日期不得小于 1900-01-01 。

有什么方法可以使用 javax.validation api 我们可以做到吗?

Class Employee{

 ----
 ---
  @Past(message="date of birth must be less than today")  
  @DateTimeFormate( pattern="yyyy-MM-dd")
  private Date dateOfBirth;

  //constuctor

  //getter & setter

}

【问题讨论】:

  • 您可以进一步了解如何定义自定义验证并为它们使用注释
  • 仅供参考,可怕的 Date 类在几年前被现代 java.time 类所取代,并采用了 JSR 310。具体来说,Instant。与传统课程不同,现代课程使用理智的年份和月份计数。对于没有时间和时区的仅日期值,请使用LocalDate

标签: java spring-boot datetime request javax.validation


【解决方案1】:

您应该为此提议定义自定义注释。像下面这样:

@Target(ElementType.FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = DateValidator.class)
@Documented
public @interface IsAfter{
   String message() default "{message.key}";
   String current();
}

并像这样定义一个自定义验证器:

public class DateValidator implements ConstraintValidator<IsAfter, LocalDate> {

String validDate;

@Override
public void initialize(IsAfter constraintAnnotation) {
    validDate = constraintAnnotation.current();
}

@Override
public boolean isValid(LocalDate date, ConstraintValidatorContext constraintValidatorContext) {
    String[] splitDate = validDate.split("-");
    return date.isAfter(LocalDate.of(Integer.valueOf(splitDate[0]), Integer.valueOf(splitDate[1]), Integer.valueOf(splitDate[2])));
  }
}

并使用此注释:

@Past(message="date of birth must be less than today")  
@IsAfter(current = "1900-01-01")
@DateTimeFormate( pattern="yyyy-MM-dd")
private Date dateOfBirth;

注意:我没有测试过这个注解!

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多