Рубрики
Без рубрики

Java Аннотации в Spring: Создайте ограничения Dto

Яркие, найти людей, которые хотят создать аннотации, со мной! Здравствуйте, дорогие разработчики! Сегодня nes… Помеченный как java, весна, подсказка.

Яркие, найти людей, которые хотят создать аннотации со мной!

Здравствуйте, дорогие разработчики! Сегодня в этом уроке я объясню, 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[] 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 create(@Valid @RequestBody PersonRequest personRequest) {

        ...

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[] 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[] 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”