С 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;
...