Java 使用 Hibernate 进行字符串日期验证 API
Java String Date Validation Using Hibernate API
我正在尝试使用 javax.validation
和 Hibernate 验证来验证 String Date。我需要检查给定的字符串日期应该是过去的,它应该是正确的 yyyyMMdd
格式,具有闰年、30th
、31st
日等所有限制。
public class UserInformation {
@NotNull
public String idNum = null;
@NotNull
//@Past
@Pattern(regexp="\d{4}(1[012]|0[1-9])(3[01]|[12]\d|0[0-9])")
public String dob= null;
}
我尝试使用此代码但无法正常工作。有什么解决办法吗。如果我们有自定义验证器,那么它是在 level.Please 字段中提供建议还是代码片段。
如果您使用 Spring-Context 模块作为依赖项,您可以使用 @DateTimeFormat
并执行以下操作。
@NotNull
@DateTimeFormat(pattern="yyyyMMdd")
public String dob= null;
或者您可以编写自己的自定义验证器。
选项 1
将您的模式更改为:
Pattern(regexp = "([0-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/[0-9]{4}")
但请记住,这种验证不会检查 2 月是否少于 28/29 天,以及其他日期限制。
选项 2
创建自定义约束验证器
Annotation
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = CheckDateValidator.class)
@Documented
public @interface CheckDateFormat {
String message() default "{message.key}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
String pattern();
}
Validator class
有了 Date 对象,您可以进行任何其他您想要的验证(比如拒绝过去的日期)
public class CheckDateValidator implements ConstraintValidator<CheckDateFormat, String> {
private String pattern;
@Override
public void initialize(CheckDateFormat constraintAnnotation) {
this.pattern = constraintAnnotation.pattern();
}
@Override
public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
if ( object == null ) {
return true;
}
try {
Date date = new SimpleDateFormat(pattern).parse(object);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
Use
@CheckDateFormat(pattern = "ddMMyyyy")
private String value;
我正在尝试使用 javax.validation
和 Hibernate 验证来验证 String Date。我需要检查给定的字符串日期应该是过去的,它应该是正确的 yyyyMMdd
格式,具有闰年、30th
、31st
日等所有限制。
public class UserInformation {
@NotNull
public String idNum = null;
@NotNull
//@Past
@Pattern(regexp="\d{4}(1[012]|0[1-9])(3[01]|[12]\d|0[0-9])")
public String dob= null;
}
我尝试使用此代码但无法正常工作。有什么解决办法吗。如果我们有自定义验证器,那么它是在 level.Please 字段中提供建议还是代码片段。
如果您使用 Spring-Context 模块作为依赖项,您可以使用 @DateTimeFormat
并执行以下操作。
@NotNull
@DateTimeFormat(pattern="yyyyMMdd")
public String dob= null;
或者您可以编写自己的自定义验证器。
选项 1
将您的模式更改为:
Pattern(regexp = "([0-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/[0-9]{4}")
但请记住,这种验证不会检查 2 月是否少于 28/29 天,以及其他日期限制。
选项 2
创建自定义约束验证器
Annotation
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = CheckDateValidator.class)
@Documented
public @interface CheckDateFormat {
String message() default "{message.key}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
String pattern();
}
Validator class
有了 Date 对象,您可以进行任何其他您想要的验证(比如拒绝过去的日期)
public class CheckDateValidator implements ConstraintValidator<CheckDateFormat, String> {
private String pattern;
@Override
public void initialize(CheckDateFormat constraintAnnotation) {
this.pattern = constraintAnnotation.pattern();
}
@Override
public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
if ( object == null ) {
return true;
}
try {
Date date = new SimpleDateFormat(pattern).parse(object);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
Use
@CheckDateFormat(pattern = "ddMMyyyy")
private String value;