Валидация значений в Spring Boot

Что бы не выдумывать велосипед

Зависимость и настройка

Добавляем в pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

или

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

Первый ее под капотом использует

Подробнее про Hibernate Validator можно прочитать тут

Для запуска механизма валидации обычно используют две аннотации: @Valid и @Validated.

Примеры @Valid:

@Validated используется для групповой или частичной поверки.
Подробнее тут

Разница между @Validated и @Valid - тут

Аннотаций для условий валидации очень много.
Часто используемые @NotBlank, @NotEmpty и @NotNull.

Спецификация по всем аннотациям

@NotNull

javax.validation.constraints

Аннотация @NotNull проверяет, что значение поля не равно null.

Она не проверяет, пустое ли значение или состоит ли оно из пустых пробелов.

Используется в случаях, когда необходимо удостовериться, что поле содержит какое-либо значение, а не является null.

Пример:

public class User {
    @NotNull
    private String username;

    // getters and setters
}

@NotEmpty

javax.validation.constraints

Аннотация @NotEmpty гарантирует, что поле не равно null и не является пустой коллекцией или строкой.

Она применяется к коллекциям, строкам или массивам.

Используется, когда необходимо удостовериться, что значение существует и не является пустым.

Пример:

public class User {
    @NotEmpty
    private List<String> roles;

    // getters and setters
}

@NotBlank

javax.validation.constraints

Аннотация @NotBlank применяется только к строкам и проверяет, что строка не равна null, не является пустой и не состоит только из пробелов.

Используется тогда, когда необходимо удостовериться, что строка содержит значимые символы.

Пример:

public class User {
    @NotBlank
    private String name;

    // getters and setters
}

@Pattern

javax.validation.constraints

Аннотация @Pattern из пакета javax.validation.constraints используется для проверки соответствия строкового поля заданному регулярному выражению.

Она не включает в себя проверку на null или пустую строку.

Если вам нужно одновременно проверить, что строка соответствует определенному шаблону и не является null или пустой, вы должны использовать @Pattern вместе с другими аннотациями, такими, как @NotNull, @NotEmpty или @NotBlank.

Пример:

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

public class User {
    @NotBlank
    @Pattern(regexp = "^[a-zA-Z0-9]+$")
    private String username;

    // getters and setters
}

В этом примере:

  • @NotBlank: Указывает, что строка не должна быть null, пустой или состоять только из пробелов.
  • @Pattern(regexp = "^[a-zA-Z0-9]+$"): Указывает, что строка должна соответствовать регулярному выражению, которое допускает только алфавитно-цифровые символы.

Если вы используете только @Pattern, нужно дополнительно использовать @NotNull, @NotEmpty или @NotBlank для полной проверки.

Различия

Отличия:

между часто используемыми

  • @NotNull проверяет только на null.
  • @NotEmpty проверяет на null и пустое значение (например, пустую коллекцию, массив или строку).
  • @NotBlank проверяет на null, пустое значение и исключительно пробелы (применимо только к строкам).

Когда использовать:

  • Используйте @NotNull для значений, которые обязательно должны присутствовать.
  • Используйте @NotEmpty для коллекций, массивов или строк, которые обязательно должны иметь хотя бы одно значение/элемент.
  • Используйте @NotBlank для строк, которые должны содержать осмысленный текст (без пробелов и пустоты).

Как валидировать число?

Для поля типа Integer (int) наиболее подходящей аннотацией для валидации будет @NotNull.

Если нужно проверить, что значение находится в допустимом диапазоне (например от 0 до 65535), можно дополнительно использовать аннотацию @Min и @Max.

Пример:

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Min;
import javax.validation.constraints.Max;

public class ServerConfig {
    @NotNull
    @Min(0)
    @Max(65535)
    private Integer port;

    // getters and setters
}

Объяснение:

  1. @NotNull: Указывает, что поле не должно быть null.
  2. @Min(0): Указывает минимальное допустимое значение для порта.
  3. @Max(65535): Указывает максимальное допустимое значение для порта.

Эти аннотации вместе гарантируют, что значение поля port будет не только задано, но и находиться в допустимом диапазоне для номеров портов.

Валидировать можно почти все

Описание всех доступных аннотаций