Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Проверка данных

Клиент может прислать пустой заголовок или текст в тысячу страниц. Проверять каждое поле через if утомительно. Стандарт Jakarta Validation позволяет описать правила аннотациями прямо на полях DTO, а Spring проверит их до вызова метода контроллера. Неверный запрос получит ответ 400, и метод даже не начнёт работу.

Подключение

Проверка — отдельный модуль. Добавьте стартер в pom.xml (на start.spring.io он называется Validation):

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

Стартер подключает Hibernate Validator — самую распространённую реализацию стандарта.

Правила на полях

// src/main/java/com/example/blog/NewPostRequest.java
package com.example.blog;
 
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
 
public record NewPostRequest(
        @NotBlank @Size(max = 120) String title,
        @NotBlank String body,
        @NotBlank String author) {
}

@NotBlank запрещает null, пустую строку и строку из одних пробелов. @Size(max = 120) ограничивает длину заголовка.

Включение проверки

// src/main/java/com/example/blog/PostController.java
@PostMapping
public ResponseEntity<Post> create(@Valid @RequestBody NewPostRequest request) {
    Post post = postService.create(request);
    return ResponseEntity.created(URI.create("/api/posts/" + post.id())).body(post);
}

Аннотация @Valid (из пакета jakarta.validation) запускает проверку. Добавьте её и в метод update.

Что получит клиент

curl -i -X POST http://localhost:8080/api/posts \
  -H "Content-Type: application/json" \
  -d '{"title":"","body":"x"}'
HTTP/1.1 400
 
{"timestamp":"2026-10-04T08:50:07.790Z","status":400,"error":"Bad Request","path":"/api/posts"}

Статья не создана. Подробности Spring пишет только в журнал (строка сокращена):

WARN ... Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] ... with 2 errors: [Field error in object 'newPostRequest' on field 'author' ...

Клиенту же нужно знать, какие поля неверны. В следующем уроке мы вернём ему список ошибок по полям.

Частые аннотации

АннотацияПроверяет
@NotNullЗначение не null
@NotBlankСтрока не пустая и не из пробелов
@Size(min, max)Длина строки или размер списка
@Min, @MaxГраницы числа
@EmailПохоже на адрес почты
@Pattern(regexp)Строка подходит под регулярное выражение
@Past, @FutureДата в прошлом или будущем

Своё сообщение

У каждой аннотации есть параметр message:

@NotBlank(message = "Заголовок обязателен") String title

Без него Hibernate Validator берёт стандартный текст на языке из заголовка запроса Accept-Language, а если заголовка нет — на языке системы: не должно быть пустым для русского, must not be blank для английского.

Частая ошибка

Если забыть @Valid перед @RequestBody, аннотации на полях ничего не делают. Ошибки не будет — статья с пустым заголовком тихо сохранится. После добавления правил всегда проверяйте их запросом с неверными данными и убеждайтесь, что приходит 400.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.