Яркие, найти людей, которые хотят создать аннотации со мной!
Здравствуйте, дорогие разработчики! Сегодня в этом уроке я объясню, 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 ResponseEntity5.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”