Яркие, найти людей, которые хотят создать аннотации со мной!
Здравствуйте, дорогие разработчики! Сегодня в этом уроке я объясню, o , которые e как ведут себя знаменитые аннотации, механизм очень мощный и не очень изучены разработчиками вселенной Java. Кроме того, стучатся, я представляю два примера очень простые, которые могут быть хорошим руководящим вам, что начиная этот поход.
-1. Совместив ожидания
В этом учебнике вы найдете:
- Понятия о том, что представляет собой аннотация
- Наличие книжки
- Примеры аннотаций доступны во время выполнения, ориентированных на проверку ограничений
В этом уроке вы не будет найти:
- Теоретическую основу плотной (оставлю хорошие материалы в качестве ссылки)
- Включение атрибутов в аннотации
- Усо де размышления
1. Что это такое?
“В аннотации, ответственных за предоставление дополнительной информации о программе.” (GeeksForGeeks, 2020, перевод наш)
Второй Oracle ([20–]) ” […] форма метаданных, предоставляют данные о программе, которая не является частью самой программы”.
В аннотации приходится вставлять дополнительные данные в исходный код. (Groner, 2015)
Заметки появились, начиная с версии 1.5 в Java и предшествует один знак @
. Вы, вероятно, уже заметили некоторые, разбросанных в свой код, например: @Переопределение
, @Тело запроса
, @Переменный путь
, @Получатель
, @Сеттер
.
2. Какие цели?
Заметки также могут быть использованы в трех разных целей, в течение всего жизненного цикла проекта (кто определяет этот параметр является мета-annotation вызова @Retention
, в которой, буду вдаваться в подробности в следующих разделах). Этот параметр также важно указать, в какой момент все инструкции, аннотации должны быть доступны и будут аннулированы (JAVA2NOVICE, 2020). Три цели являются примером ниже:
Инструкции во время компиляции (CLASS): целью создания исходного кода во время компиляции. Um exemplo famoso é о картографической структуре библиотеки, как быстро собрать все компоненты, как преобразовать объекты в исходные данные, как использовать их в качестве интерфейсов @Картограф
(MAPSTRUCT, [201-]). Инструкции во время строительства (SOURCE): целью создания упаковывать файлы, XML-файлы во время создания проекта, то есть, на этапе, создается файл .jar
или .war
(JENKOV, 2019). Инструкции во время выполнения(RUNTIME): цели, создание проверок или вводить данные во время выполнения, как, например, заметку @NotNull
, который используется для проверки обязательного атрибута класса.
4. Как это работает: практический пример
Общие сведения о трех целей, представленные в предыдущем разделе, и, зная, что мы хотим, чтобы создавать заметки, которые подтвердили наши запросы нам, что они имеются в выполнения .
Как фокус этого учебника являются заметки доступны во время выполнения, мы используем, как пример, объясняющий, аннотации @NotNull
подарок на проект JakartaEE
.
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) @Repeatable(NotNull.List.class) @Documented @Constraint( validatedBy = {} ) public @interface NotNull { String message() default "{javax.validation.constraints.NotNull.message}"; Class>[] groups() default {}; Class extends Payload>[] payload() default {}; @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface List { NotNull[] value(); } }
Ниже вы можете отслеживать мета-аннотации и атрибуты имени и значение:
Указывает, что контекст, данное примечание может быть применен. Эти значения обозначаются перечислитель ElementType. В примере выше мы видим, что можно применить это обозначение уровней: методы, поля (атрибуты), классы, конструкторы и параметр | @Target |
Указывает, является ли заметка будет доступен во время компиляции, выполнения и строительство. Эти значения обозначаются перечислитель RetentionPolicy. В приведенном выше примере, хранения, типа во время ВЫПОЛНЕНИЯ, то есть, аннотации, будет доступен для использования во время выполнения. | @Retention |
Указывает, возможность использовать больше раз и аннотации в классе. Обратите внимание, что в этом мета-annotation сообщил, тип аннотации, в которой вы хотите повторить. В конце реализации того же, можно проследить своего рода “sub-annotation”, который имеет массив типа NotNull. Можно только заметку с помощью механизма воспроизведения в случае, если будет реализован эту структуру в массив того же типа. | @Repeatable |
Указывает, что этот объект будет описана через javadoc или подобный инструмент. | @Documented |
Указывает, что объект будет помечен на использование ограничение проверка. Атрибут validatedBy указывает класс, который будет содержать это ограничения проверки (в приведенном выше примере не было elencada этот класс проверки, однако в примерах, представленных в следующих разделах я представляю использование этой функции). Com a adoção desta anotação, необходимость реализации отдельных атрибутов: сообщения, группы, полезная нагрузка. | @Constraint |
Отображает сообщение об ошибке, в котором будет сообщено, если ограничения проверки может быть нарушена. По умолчанию, необходимо сообщить сообщение об ошибке, которое, вероятно, будет в файле message.properties вашего проекта. Нет примера асимы, эста менсагем эста интернационале эм аркивос .недвижимость в библиотеке Джакарты. | message() |
Этот атрибут является вопрос о том, что vendria хорошая статья. Но вкратце, этот атрибут служит для создания группы проверки конкретных. В примере, вы понимаете, что мы не используем этот ресурс. Он просто там в качестве своего рода “контракт” необходимо за счет использование аннотации @Constraint. | groups() |
Этот атрибут является предмет, который принесет хорошая статья. Согласно документации JBoss (2020), “можно использовать […] назначение объектов, полезных пользовательских ограничений”. В примере, вы понимаете, что мы не используем этот ресурс. Он просто там в качестве своего рода “контракт” необходимо за счет использование аннотации @Constraint. | payload() |
5. Создание заметок
Наше дело: у Нас есть RESTful API, ответственным за регистрацию, физическими и юридическими лицами. Эти люди должны иметь информацию, как: название документа и типа документа. Мы будем использовать два подхода для проверки этих полей: использование аннотации на уровне класса и поля.
Во-первых, необходимо добавить в заметки @Valid
рядом с @RequestBody
. Только таким образом, возможно, что и проверки, имеющихся в книжке, используемые класс PersonRequest
применяются. Ниже вы читаете, как лежит фрагмент кода, где, если добавить это свойство:
@RestController public class PersonController { @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity
5.1 Уровне поля (Field Level)
Мы будем создавать заметки, которые смогут проверить, если поле fullName
более одного слова. Если это поле имеет только одно слово, то будет выдано исключение. В отрывке ниже, можно увидеть, класс PersonRequest
аннотации @GreaterThanOneWord
вверх полевой fullName
:
public class PersonRequest { @GreaterThanOneWord @NotBlank private String fullName; @NotBlank private String document; @NotNull private DocumentType documentType;
Ставим заметку несуществующий выше атрибута, но пришло время положить руку в тесто и создает его!
Ниже вы можете следить за осуществление аннотация:
@Repeatable(GreaterThanOneWord.List.class) @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = GreaterThanOneWorldValidation.class) public @interface GreaterThanOneWord { String message() default "{error.business.greater_than_one_word}"; Class>[] groups() default {}; Class extends Payload>[] payload() default {}; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) @interface List { GreaterThanOneWord[] value(); } }
Обратите внимание, что в приведенном выше примере, мы используем meta-annotation @Repeatable
для обеспечения повторного использования этой аннотации в других атрибутов одного и того же класса. В @Target
, сообщаем вам, что аннотацию можно использовать только на местном уровне. В @Retention
, мы используем тип RUNTIME
по причине их использование во время выполнения. В @Constraint
, обратите внимание на атрибут validatedBy
класс, который мы будем применять для проверки, которая покажет, имела ли место или нет нарушение.
В техно ниже можно отслеживать файл messages_en_US.properties
сообщение по умолчанию, которое будет отображаться в случае нарушения запрета:
error.business.greater_than_one_word=The field must be filled with more than one word
Ниже вы можете отслеживать осуществления проверки ограничений:
public class GreaterThanOneWorldValidation implements ConstraintValidator{ @Override public boolean isValid(String field, ConstraintValidatorContext constraintValidatorContext) { return field.split(" ").length > 1; } }
Обратите внимание, в примере выше, что чтобы использовать этот класс в собственности validatedBy
, необходимо, чтобы это реализовать интерфейс ConstraintValidator
. В двух обобщения, представленные в интерфейсе, вы должны сообщить:
- 1: тип аннотации создана
- 2: тип объекта, который проверяется (если необходимо работать с атрибутами родовых вы должны сообщить
Объект
)
Этот интерфейс предлагает два метода:
initilize()
: может или не может быть реализован. Как правило, используется, когда заметка получите информацию на атрибуты, которые должны быть использованы в методеisValid
.isValid()
: метод логического проверять, есть ли ограничение нарушено или нет. Там применяется логики желаемого. В случае вернитесьtrue
означает, что ограничение было нарушено, в противном случае будет сгенерировано исключение.
Зайдите на ССЫЛКА репозитория проекта. Там вы найдете полную реализацию, кроме того, обработка исключений, интернационализации и модульное тестирование.
5.2 Уровне класса (Type Level)
Теперь мы будем создавать заметки, чтобы проверить, если количество символов, введенных в поля document
соответствует documentType
в курсе, то есть:
- если
documentType
равноИНН
, |поле| documentдолжен быть 14 символов
если - documentType
равно
DWRполе
documentдолжно быть 11 символов
Прошу не учитывать точность этой проверки, в которой я создал, потому что мы знаем, что есть несколько вариантов, о количестве символов с ИНН. Но в образовательных целях, этот пример будет полезен.
В отрывке ниже, можно увидеть заметки @IsValidDocumentFormat
класс PersonRequest
:
@IsValidDocumentFormat public class PersonRequest { @NotBlank private String fullName; @NotBlank private String document; @NotNull private DocumentType documentType;
Ниже вы можете следить за осуществление аннотация:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = IsValidDocumentFormatValidation.class) public @interface IsValidDocumentFormat { String message() default "{error.business.is_valid_document_format}"; Class>[] groups() default {}; Class extends Payload>[] payload() default {}; }
Как показано в примере, akuma, мы используем meta-annotation @Repeatable
, потому что мы надеемся, что это должна использоваться только один раз в классе. В @Target
, сообщаем вам, что аннотацию можно использовать только на уровне класса. Другие мета-аннотации, уже были урегулированы в подразделе в предыдущем.
В техно ниже можно отслеживать файл messages_en_US.properties
сообщение по умолчанию, которое будет отображаться в случае нарушения запрета:
error.business.is_valid_document_format=Invalid document format for the type entered
Ниже вы можете отслеживать осуществления проверки ограничений:
public class IsValidDocumentFormatValidation implements ConstraintValidator{ @Override public boolean isValid(PersonRequest personRequest, ConstraintValidatorContext constraintValidatorContext) { final boolean isValidCpf = personRequest.getDocument().length() == 11 && personRequest.getDocumentType() .equals(DocumentType.CPF); final boolean isValidCnpj = personRequest.getDocument().length() == 14 && personRequest.getDocumentType() .equals(DocumentType.CNPJ); return isValidCpf || isValidCnpj; } }
Обратите внимание, что в двух обобщения, представленные в интерфейсе, вы должны сообщить:
- 1: тип аннотации создана
- 2: тип класса, который будет проверен (если вы хотите работать универсальные классы, вы должны сообщить
Объект
)
Зайдите на ССЫЛКА репозитория проекта. Там вы найдете полную реализацию, кроме того, обработка исключений, интернационализации и модульное тестирование.
6. Заключение и следующие шаги
Что мы можем заключить о adotação книжки в том, что они могут быть прекрасным механизмом для проведения проверки ввода, reaproveitando коды и отвлечения от многих структур.
Важно отметить, что заметки не решения заклинаний, которые решают все ваши проблемы. Они не могут быть использованы слишком много, не иметь большой ответственности и точки его бизнес-слой, чтобы стать всего лишь второго плана в рамках своей службы (я считаю, что это не будет устав в том числе, крупнейших обсуждения).
В этом примере, я не мог представить аннотации во время компиляции и строительства, либо принятие книжки универсальные, которые делают использование Reflections. Я решил привести в данной статье этот фрагмент, чтобы мы могли идти из глубины, постепенно. Если вы хотите, чтобы я продолжил эту серию статей написать в комментариях или на мой LinkedIn.
Я оставлю ниже ссылки на мои исследования, и я настоятельно рекомендую вам прочитать их, главным образом, в официальной документации о мета-аннотации.
Характеристика:
DOLSZEWSKI. Весенняя пользовательская проверка на примере . Доступен на: http://dolszewski.com/spring/custom-validation-annotation-in-spring/ . Добавлено: 26 лет назад 2020. ГИКИ ДЛЯ ГИКОВ. Аннотации На языке Java . Опровергнуть их: https://www.geeksforgeeks.org/annotations-in-java/ . Добавлено: 23 года назад 2020. ГРОНЕР, Лояна. Видео: Курс Java, 65: Аннотации (заметки) . Доступен на: https://www.youtube.com/watch?v=6M8EE_oRwtM . Добавлено: 23 года назад 2020. ДЖАКАРТА. Тип Аннотации Не Нулевой . Опровергнуть их: https://jakarta.ee/specifications/platform/8/apidocs/javax/validation/constraints/NotNull.html . Добавлено: 23 года назад 2020. JAVA2НОВИНКА. Какова политика хранения аннотаций java? . Опровергнуть их: https://www.java2novice.com/java-annotations/retention-policy/#:~:text=Annotation%20with%20retention%20policy%20SOURCE,to%20the%20JVM%20through% 20 время выполнения . Добавлено: 26 лет назад 2020. JBOSS. 6. Создание пользовательских ограничений . Доступен на: Доступен на: . Доступ на 26 Августа 2020. JENKOV, Якоб. Аннотации Java . Опровергнуть их: http://tutorials.jenkov.com/java/annotations.html . Добавлено: 23 года назад 2020. КАРТОГРАФИЧЕСКАЯ КОНСТРУКЦИЯ. Тип аннотации картографа . Опровергнуть их: https://mapstruct.org/documentation/dev/api/ . Добавлено: 26 лет назад 2020. ОРАКУЛ. Ограничение типа аннотации . Опровергнуть их: https://jakarta.ee/specifications/platform/8/apidocs/javax/validation/Constraint.html . Добавлено: 26 лет назад 2020. ОРАКУЛ. Тип аннотации Документирован . Опровергнуть их: https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Documented.html?is-external=true . Добавлено: 26 лет назад 2020. ОРАКУЛ. Тип аннотации Повторяемый . Опровергнуть их: https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Repeatable.html?is-external=true . Добавлено: 26 лет назад 2020. ОРАКУЛ. Сохранение типа аннотации . Опровергнуть их: https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Retention.html . Добавлено: 26 лет назад 2020. ОРАКУЛ. Цель типа аннотации . Опровергнуть их: https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.html . Добавлено: 26 лет назад 2020. ОРАКУЛ. Урок: Аннотации . Опровергнуть их: https://docs.oracle.com/javase/tutorial/java/annotations/ .
Оригинал: “https://dev.to/renatasfraga/java-annotations-no-spring-crie-restricoes-em-suas-dtos-2nfj”