Проверка данных
Клиент может прислать пустой заголовок или текст в тысячу страниц. Проверять каждое поле через 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.