В backend-коде часто создают DTO, которые просто переносят данные из API внутрь приложения.
Например:
public record CreateUserRequest(
String email,
String name
) {}
На первый взгляд всё нормально: есть email, есть имя.
Но если такой объект проходит дальше без проверки, в бизнес-логику могут попасть пустые строки, null, мусорные email и другие некорректные значения.
new CreateUserRequest("", " ");
Код компилируется, объект создаётся, а ошибка всплывает уже позже: в сервисе, базе данных или при отправке письма.
Почему это опасно в реальных системах:
• ошибки появляются далеко от места ввода данных
• сервисы начинают дублировать одни и те же проверки
• в базе могут оказаться некорректные значенияОдин из вариантов, это валидировать данные прямо на границе системы.
Например, через Bean Validation:
public record CreateUserRequest(
@Email String email,
@NotBlank String name
) {}
В Spring Boot такой объект можно проверить автоматически:
@PostMapping("/users")
public UserDto create(@Valid @RequestBody CreateUserRequest request) {
return userService.create(request);
}
Теперь некорректный запрос не пройдёт дальше контроллера.
Но важно помнить: API-валидация не заменяет доменную модель.
Если email важная часть бизнес-логики, лучше вынести его в отдельный value object:
public record Email(String value) {
public Email {
if (value == null || value.isBlank()) {
throw new IllegalArgumentException("Email is blank");
}
}
}
Тогда внутри приложения уже нельзя случайно создать пользователя с пустым email.
👉 Java Ready | #практика