Какая польза от AnnotationProcessor против ConstraintValidator при создании пользовательской аннотации - PullRequest
0 голосов
/ 03 марта 2019

У меня есть требование создать пользовательскую аннотацию, которая при применении к методу проверяет и проверяет входные параметры (примитивные и не примитивные) на предмет различных проверок.И если проверки не пройдены, то должно возвращаться сообщение об ошибке напрямую.

Во время поиска я столкнулся с использованием AbstractProcessor и ConstraintValidator при создании пользовательской аннотации.Будучи новичком в создании пользовательских аннотаций, я хотел бы понять, как продолжить реализацию моей постановки проблемы.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Варианты использования AbstractProcessor и ConstraintValidator совершенно разные.Давайте сделаем погружение и исследуем оба.


AbstractProcessor - это

удобный суперкласс для большинства конкретных процессоров аннотаций

Так чтотакое процессоры аннотаций и каков их вариант использования?Если вы хотите сгенерировать новый исходный код на время компиляции , основываясь на аннотациях, вы можете использовать процессоры аннотаций.Они предоставляются как часть процесса компиляции и вызываются через компилятор Java.Примером этого является статические генераторы метамоделей для JPA .


A ConstraintValidator, которые могут использоваться для во время выполнения , что атрибуты, параметрыи так, чтобы удовлетворить определенное ограничение.Одним из самых популярных ограничений является @NotNull.Во время выполнения некоторый фрагмент кода, валидатор ограничений, проверяет, что все поля / параметры, отмеченные @NotNull, на самом деле не null.Если вы хотите написать собственное ограничение, вам нужно написать аннотацию, а также процессор, чтобы удовлетворить ваши ограничения. В этом руководстве на dzone.com описан процесс создания пользовательской аннотации и соответствующей ConstraintValidator.

0 голосов
/ 03 марта 2019

Прежде всего, вы должны понимать, что вы говорите о двух разных вещах.

TL; DR: время компиляции против времени выполнения - вам нужно время выполнения


Процессор аннотаций - это абстрактный термин, обозначающий процесс, который выполняется во время компиляции и который может сканировать исходные файлы,с расширением .java.

Реализация процессора обработки аннотаций *1015* может выдавать предупреждения или даже ошибки для остановки задачи компиляции на основе произвольных проверок.
Пример: «Я заметил, что кто-то передал значение null моему методу, это ошибка! Остановите все!»

Отправной точкой для реализации процессора аннотаций является AbstractProcessorбазовый класс или интерфейс Processor ( документация ).
В отличие от реализации ConstraintValidator вам также понадобится явно зарегистрировать его через файл метаданных процессора , который должен находиться под стандартным директоромy внутри произведенного JAR артефакта.

META-INF/services/javax.annotation.processing.Processor

То, что необходимо для создания процессора аннотаций , уже включено в стандартный JDK.Вам не нужны внешние зависимости.


С другой стороны, ConstraintValidator идентифицирует интерфейс, который поставляется с модулем Validation API , в пакете javax.validation,Существуют различные реализации этого API, но наиболее часто используемым является Hibernate Validator ( документация ).
Проверка, которую обеспечивает этот интерфейс, проверяется во время выполнения.

В отличие от аннотацииВ процессоре реализация Validation API должна быть предоставлена ​​вручную, например,

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.15.Final</version>
</dependency>

Вы написали

при применении к методу проверки, а проверяет входные параметры (Примитив и не примитив) против различных проверок

Кажется, вам нужно написать проверки во время выполнения, что означает, что Validation API дорога, чтобы взять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...