【问题标题】:Java String Date Validation Using Hibernate API使用 Hibernate API 的 Java 字符串日期验证
【发布时间】:2018-06-08 19:11:02
【问题描述】:

我正在尝试使用 javax.validation 和 Hibernate 验证来验证 String Date。我需要检查给定的字符串日期应该是过去的,它应该是正确的yyyyMMdd 格式与所有约束,如闰年、30th31st 天。

 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;

    }

我尝试使用此代码但无法正常工作。有什么解决办法。如果我们有自定义验证器,那么它是否在字段级别。请提供建议或代码 sn-p。

【问题讨论】:

  • 为什么不保存为日期/时间戳/等?
  • 我的要求是接受为字符串..

标签: java bean-validation


【解决方案1】:

选项 1

把你的模式改成这样:

Pattern(regexp = "([0-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/[0-9]{4}")

但请记住,这种验证不会检查 2 月是否少于 28/29 天,以及其他日期限制。

选项 2

创建您的自定义约束验证器

注释

@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<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;
        }
    }
}

使用

@CheckDateFormat(pattern = "ddMMyyyy")
private String value;

【讨论】:

  • 很抱歉提出这个问题。 @CheckDateFormat(pattern = "ddMMyyyy").. 我不能这样放。 @CheckDateFormat(pattern = "ddMMyyyy") 公共字符串 dob= null; & FIELD、METHOD、PARAMETER、ANNOTATION_TYPE 的值应该是什么。
  • FIELD、METHOD 等是 ElementType 的静态值,我做了一些修改
  • 这个没有验证 1987 年 2 月 29 日.. 它返回 true.. 所以我将代码更改为.. DateFormat dateFormat = new SimpleDateFormat( pattern ); dateFormat.setLenient(假);尝试 { dateFormat.parse(object);返回真; } catch (ParseException e) { return false;现在它的工作..
  • 它真的帮助了我。非常感谢老兄。
  • 我是正则表达式的菜鸟,你能解释一下 [0-2][0-9]/[0-1][0-9]/[0-9] 是什么意思吗{4} 是什么意思?
【解决方案2】:

如果你使用 Spring-Context Module 作为依赖,你可以使用 @DateTimeFormat 并执行以下操作。

    @NotNull
    @DateTimeFormat(pattern="yyyyMMdd")
    public String dob= null;

或者您可以编写自己的自定义验证器。

【讨论】:

  • 我没有在这里使用 spring.. 有没有办法编写字段级自定义验证器来实现这一点。
  • 在文档中指出 @DateTimeFormat 注释“可以应用于 java.util.Date、java.util.Calendar、Long(用于毫秒时间戳)以及 JSR-310 java.time和 Joda-Time 值类型。”所以这个注解没有String 类型支持。链接:docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
猜你喜欢
  • 1970-01-01
  • 2017-03-21
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 2012-06-20
  • 2015-12-08
  • 1970-01-01
相关资源
最近更新 更多