2016-09-14 3 views
1

Я использую Spring MVC с подтверждением формы. объект пользователя имеет поле логин:Как не повторять аннотации для проверки бина?

@Pattern(regexp = Constants.LOGIN_PATTERN) 
@Size(min = 4, max = 50) 
private String login; 

Но я хочу, чтобы использовать эти аннотации с другими полями, напр, с RegisterData.login.. Поэтому я создал еще одну аннотацию:

@Retention(RetentionPolicy.RUNTIME) 
@Target(value = { ElementType.FIELD, ElementType.PARAMETER }) 
@Pattern(regexp = Constants.LOGIN_PATTERN) 
@Size(min = 4, max = 50) 
public @interface Login { 
} 

И теперь отметьте поля с ним. Но это не работает. Это способ использовать этот тип 'inheritance'? Или я должен повторить себя?

+2

Это называется мета-аннотацией *, и это не поддерживается в общем случае (какое-то программное обеспечение, например Spring, специально обрабатывает его). Если Groovy является вариантом, вы можете использовать сборщик аннотаций. – chrylis

ответ

4

Вы не указали объявление аннотации @Login как ограничение, добавив аннотацию @Constraint. От Bean Validation specification:

Композиция выполняется путем аннотации аннотации ограничения с помощью аннотаций ограничения компоновки.

Поскольку ваше сжатое ограничение не требует валидатора, вы можете установить свойство validatedBy в пустой массив.

@Pattern(regexp = Constants.LOGIN_PATTERN) 
@Size(min = 4, max = 50) 
@Constraint(validatedBy = {}) 
@Target(value = { ElementType.FIELD, ElementType.PARAMETER }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Login { 

    String message() default "Incorrect login"; 

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

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

} 
Смежные вопросы