我正在尝试 使用&Hibernate验证来验证字符串日期javax.validation
.我需要检查给定的字符串日期应该是过去的,它应该是正确的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; }
我尝试使用此代码但无法正常工作.有什么解决方案吗?如果我们有自定义验证器,那么它是在字段级别.请给出建议或代码片段.
将您的模式更改为:
Pattern(regexp = "([0-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/[0-9]{4}")
但请记住,这种验证不会检查2月是否少于28/29天,以及其他日期限制.
创建自定义约束验证器
注解
@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(); }
验证器类
拥有Date对象,您可以进行任何其他验证(例如过去的拒绝日期)
public class CheckDateValidator implements ConstraintValidator{ 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; } } }
使用
@CheckDateFormat(pattern = "ddMMyyyy") private String value;