0Pricing
Java Academy · Урок

Проверка компонентов: @NotNull, @Size, @Pattern

Аннотируйте DTO ограничениями Bean Validation и запускайте проверку с помощью @Valid в контроллерах.

«Проверка компонентов: @NotNull, @Size, @Pattern» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Что такое проверка компонентов

Проверка компонентов (Jakarta Bean Validation 3.0) предоставляет декларативные аннотации ограничений для компонентов Java. Spring Boot автоматически настраивает валидатор и запускает его с помощью @Valid или @Validated.

@NotNull, @NotEmpty, @NotBlank

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

public record CreateUserRequest(
    @NotBlank(message = "Name is required")
    String name,
    @NotBlank @Email
    String email,
    @NotNull
    UserRole role
) {}

@Size и @Length

@Size(min, max) ограничивает размер строк, коллекций, отображений и массивов. @Length (Hibernate) работает только со строками. Для переносимости предпочтительно использовать @Size.

@Size(min = 3, max = 50, message = "Name must be 3-50 characters")
private String name;
@Size(min = 1, max = 10, message = "Cart must have 1-10 items")
private List<CartItem> items;

@Min, @Max, @Positive, @Range

Числовые ограничения: @Min/@Max задают точные границы, @Positive/@PositiveOrZero — ограничения на знак, а @DecimalMin/@DecimalMax предназначены для BigDecimal.

@Min(1) @Max(100)
private int quantity;
@DecimalMin("0.01") @DecimalMax("99999.99")
private BigDecimal price;
@Positive
private long orderId;

@Pattern для проверки регулярных выражений

@Pattern(regexp) проверяет строки на соответствие регулярному выражению. Это полезно для телефонных номеров, почтовых индексов и пользовательских форматов.

@Pattern(regexp = "^\\+?[1-9]\\d{7,14}$", message = "Invalid phone number")
private String phone;
@Pattern(regexp = "^[A-Z]{2}\\d{5}$", message = "Invalid postal code (e.g. AB12345)")
private String postalCode;

@Email и @URL

@Email проверяет формат адреса электронной почты (базовая проверка RFC 5321). @URL (Hibernate) проверяет формат URL. Всегда сочетайте их с @NotBlank, поскольку они допускают значение null.

@NotBlank @Email
private String email;
// Hibernate-specific:
@URL(protocol = "https")
private String profileUrl;

@Past, @Future, @PastOrPresent

Ограничения для времени проверяют значения даты и времени. Они работают с LocalDate, LocalDateTime, Instant и другими типами.

@Past(message = "Birth date must be in the past")
private LocalDate birthDate;
@Future(message = "Expiry must be in the future")
private LocalDate expiryDate;

Запуск проверки с помощью @Valid

Добавьте @Valid к параметру метода контроллера. Spring проверит объект и при ошибке выбросит MethodArgumentNotValidException, вернув ответ 400 Bad Request.

@PostMapping("/users")
public ResponseEntity<UserDto> create(@Valid @RequestBody CreateUserRequest req) {
    User user = userService.create(req);
    return ResponseEntity.status(201).body(UserDto.from(user));
}

Каскадная проверка с помощью @Valid для полей

Чтобы проверить вложенные объекты, помимо ограничений на уровне класса снабдите поле аннотацией @Valid.

public record OrderRequest(
    @NotNull @Valid
    AddressRequest shippingAddress, // validates AddressRequest constraints too
    @Valid @NotEmpty
    List<@Valid LineItemRequest> items
) {}

Группы проверки

Используйте группы, чтобы применять разные ограничения в разных контекстах (например, при создании и обновлении). Укажите интерфейс группы в аннотации и запустите проверку с помощью @Validated(CreateGroup.class).

public interface CreateGroup {}
public interface UpdateGroup {}
public record UserRequest(
    @NotBlank(groups = CreateGroup.class) String password,
    @NotNull(groups = UpdateGroup.class)  Long id
) {}
// Controller:
@PutMapping("/{id}")
public UserDto update(@Validated(UpdateGroup.class) @RequestBody UserRequest req) { ... }

Чтение ошибок проверки

Перехватите MethodArgumentNotValidException в @ControllerAdvice, чтобы извлечь ошибки полей и сформировать структурированные ответы с ошибками.

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidation(MethodArgumentNotValidException ex) {
    Map<String, String> errors = new LinkedHashMap<>();
    ex.getBindingResult().getFieldErrors().forEach(e ->
        errors.put(e.getField(), e.getDefaultMessage()));
    return ResponseEntity.badRequest().body(errors);
}

Быстрая проверка

Какая аннотация проверяет, что String не равна null И не является пустой или состоящей только из пробелов?

Итоги

Добавляйте к DTO ограничения проверки компонентов. Добавляйте @Valid в контроллерах, чтобы запускать проверку. Используйте @NotBlank для строк, @Size для длины, @Pattern для регулярных выражений, @Past/@Future для дат. Обрабатывайте ошибки в @ControllerAdvice.

Часто задаваемые вопросы

Урок «Проверка компонентов: @NotNull, @Size, @Pattern» бесплатный?

Да — полный текст урока «Проверка компонентов: @NotNull, @Size, @Pattern» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Проверка компонентов: @NotNull, @Size, @Pattern»?

Аннотируйте DTO ограничениями Bean Validation и запускайте проверку с помощью @Valid в контроллерах. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Проверка компонентов: @NotNull, @Size, @Pattern»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проверка компонентов: @NotNull, @Size, @Pattern
  2. Пользовательские аннотации ограничений
  3. Глобальная обработка исключений с @ControllerAdvice
  4. Детали проблемы RFC 7807 и единообразные ответы с ошибками
← Назад к Java Academy