定义扩展现有规范的自定义验证注释 - javaEE

时间:2018-05-02 14:38:54

标签: validation java-ee-6

我想定义一个使用@DateOfBirthValid注释的自定义@Pattern验证注释,以便我定义出生日期模式一次并在任何地方使用它...我知道我可以使用它来定义它@Constraint(validatedBy = SomeClass.class)然后在isValid()内定义SomeClass方法,但我想知道是否有更直接的方式来使用@Pattern注释并将其提供给我想要的出生正则表达式。 ..原因是我想在代码中的许多地方使用相同的验证注释,而无需再次定义模式

1 个答案:

答案 0 :(得分:0)

来自https://docs.oracle.com/javaee/6/tutorial/doc/gkfgx.html

  

Bean Validation包含几个内置约束,可以组合这些约束来创建新的可重用约束。这可以简化约束定义,允许开发人员定义由几个内置约束组成的自定义约束,然后可以使用单个注释将其应用于组件属性。

在链接的示例中,您可以看到如何使用@Pattern(以及其他)来创建电子邮件验证注释:

@Pattern.List({
  @Pattern(regexp = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\."
    +"[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*"
    +"@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")
})
@Constraint(validatedBy = {})
@Documented
@Target({ElementType.METHOD,
    ElementType.FIELD,
    ElementType.ANNOTATION_TYPE,
    ElementType.CONSTRUCTOR,
    ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Email {

    String message() default "{invalid.email}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Target({ElementType.METHOD,
        ElementType.FIELD,
        ElementType.ANNOTATION_TYPE,
        ElementType.CONSTRUCTOR,
        ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface List {
        Email[] value();
    }
}

因此,根据我(对此有限)的理解,您应该能够为此

创建一个新的注释类似
@Pattern(regexp = yourRegex)
@Documented
@Target(/* all targets here */)
@Retention(RetentionPolicy.RUNTIME)
public @interface DateOfBirthValid {
    /* all methods required */
    /* Same thing for the List interface */
}

然后应该可以使用

@DateOfBirthValid
protected String myString

或来自链接的示例

  

然后可以将此自定义约束应用于属性。

...
@Email
protected String email;
...