Статьи
YouTube-канал

Валидация бинов в Spring

28 апреля 2019

Тэги: Java Spring

Spring позволяет проверять формат данных в бинах в декларативном стиле при помощи специальных аннотаций из пакета javax.validation.

Предположим, у нас есть rest-контроллер, в который мы хотим добавить метод, создающий пользователя. Очевидно, что это будет POST-запрос:

@PostMapping("/users")
public String createUser(@Valid @RequestBody CreateUserRequest request) {
    // создание пользователя в БД
    return "Success";
}

На вход метод принимает бин CreateUserRequest, который мы будем передавать в формате json. Этот параметр метода снабжён аннотациями @RequestBody (говорит, что параметр будет именно в теле запроса) и @Valid (аннотация, которая активирует механизм валидации для данного бина). Обратите внимание, что если не указать аннотацию @Valid, то валидация работать не будет.

В случае успеха в ответ на наш запрос мы увидим строку «Success».

Сам бин, представляющий тело запроса, выглядит так:

public class CreateUserRequest {

    @NotNull
    private String name;

    @Past
    @NotNull
    private LocalDate birthDate;

    @Positive
    private Integer friendsCount;

    @NotNull
    @Size(min = 1, max = 10)
    private List<String> documents;

    // get- и set-методы...
}

Здесь представлены основные аннотации, используемые для валидации входных данных.

  • Аннотация @NotNull указывает на обязательность параметра. Если мы такую аннотацию вешаем на числовые типы, то следует использовать именно ссылочные типы, а не примитивные, иначе смысл аннотации теряется. Например, тип int всегда имеет значение по умолчанию, а потому проверка не сработает даже если в теле запроса этот параметр не будет указан. Чтобы отловить эту ситуацию, используйте ссылочный Integer.
  • Аннотация @Past применительно к датам проверяет, что указана уже прошедшая дата. Очевидно, что дата рождения пользователя всегда меньше текущей даты.
  • Аннотация @Positive указывает, что число должно быть положительным. В нашем случае это поле friendsCount, ведь количественные характеристики не могут быть отрицательными. При этом обратите внимание, что у данного поля нет аннотации @NotNull, т.е. оно является необязательным.
  • Аннотация @Size применительно к спискам позволяет задать минимальное и максимальное количество элементов. Очевидно, что у любого человека есть как минимум один документ - паспорт.

Json, который будет передан в теле запроса и который будет удовлетворять всем этим проверкам, может выглядеть так:

{
  "name": "Иван",
  "birthDate": "1988-01-01",
  "documents": [
    "паспорт",
    "водительское удостоверение"
  ]
}

Если же мы нарушим хотя бы одно условие, то в ответ получим json с детальным описанием ошибки. Статус ответа будет не 200, а 400 (Bad Request).

Мы рассмотрели основные аннотации, используемые для проверки входных данных. Но все названия этих аннотаций довольно точно описывают их назначение.


Облако тэгов

Kotlin, Java, Java 16, Java 11, Java 10, Java 9, Java 8, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Hibernate, Collections, Stream API, многопоточность, ввод-вывод, Apache, maven, gradle, JUnit, YouTube, новости, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml

Последние статьи


Комментарии

Добавить комментарий

×

devmark.ru