2016-04-07 4 views
0

Я пытаюсь создать свою собственную аннотацию для локальных переменных, но я просто не понимаю, как аннотации, такие как @NotNull или @Null, фактически реализованы в коде. Я посмотрел на реальный файл, вот @NotNull:Реализация валидации Javax

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
@Documented 
@Constraint(validatedBy = { }) 
public @interface NotNull { 

    String message() default "{ javax.validation.constraints.NotNull.message }"; 

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

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

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

Но я не вижу где-нибудь, где она проверяет, есть ли что-то null или нет. Где происходит фактическая проверка?

ответ

1

Обычно вы должны предоставить класс validatedBy, который используется для проверки

@Target(TYPE) 
@Retention(RUNTIME) 
@Documented 
@Constraint(validatedBy = {TicketPresenceValidator.class}) 
public @interface AtLeastOneTicket { 
} 


public class TicketPresenceValidator implements ConstraintValidator<AtLeastOneTicket, TicketInfo> { 
@Override 
public void initialize(TicketInfo constraintAnnotation) { 
} 

@Override 
public boolean isValid(TicketInfo ticketInfo, 
         ConstraintValidatorContext context) { 
    return ticketInfo.getSize() != 0; 
} 
} 

Для встроенных ограничений (от javax.validation. * Пакет), как NotNull валидаторы предоставляются библиотекой реализации. Например реализации Hibernate Validator, здесь

NullValidator реализация

Тогда ограничения и валидаторы связаны друг с другом в helper class

+0

да я получить эту часть, я на самом деле сделал аннотации, который использует этот валидатор. Но мне интересно, как именно был реализован '@ NotNull', поскольку я не вижу никаких валидаторов в любом месте. – Richard

+0

Обновленный ответ с объяснением встроенных ограничений. –

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