Определите пользовательскую аннотацию проверки, которая расширяет существующую - javaEE - PullRequest
0 голосов
/ 02 мая 2018

Я хочу определить пользовательскую аннотацию @DateOfBirthValid проверки, которая использует аннотацию @Pattern, чтобы я однажды определил шаблон даты рождения и использовал его везде ... Я знаю, что тогда я могу определить его с помощью @Constraint(validatedBy = SomeClass.class) определите метод isValid() внутри SomeClass, но мне интересно, есть ли более прямой способ использовать аннотацию @Pattern и указать для него дату рождения, которую я хочу ... причина в том, что я хочу использовать то же самое аннотация проверки во многих местах кода без повторного определения шаблона

1 Ответ

0 голосов
/ 07 июня 2018

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