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

Вернуться назад

28 апреля 2019

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).

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

Тэги: Java, Spring.



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

Ваше имя:
Текст комментария: