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