HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Валидация - это механизм проверки данных объекта на корректность перед их сохранением в базу данных. Валидация реализуется набором аннотаций Jakarta Bean Validation, которые обычно применяются к сущностям и DTO. В этом уроке мы поговорим о том, как добавить правила валидации и как выполнить саму валидацию.</p>
1 <p>Валидация - это механизм проверки данных объекта на корректность перед их сохранением в базу данных. Валидация реализуется набором аннотаций Jakarta Bean Validation, которые обычно применяются к сущностям и DTO. В этом уроке мы поговорим о том, как добавить правила валидации и как выполнить саму валидацию.</p>
2 <h2>Описание валидации</h2>
2 <h2>Описание валидации</h2>
3 <p>Возьмем для примера модель User с добавленными аннотациями для валидации:</p>
3 <p>Возьмем для примера модель User с добавленными аннотациями для валидации:</p>
4 <p>В этом примере:</p>
4 <p>В этом примере:</p>
5 <ul><li>@Email проверяет, что email содержит корректный адрес</li>
5 <ul><li>@Email проверяет, что email содержит корректный адрес</li>
6 <li>@NotBlank проверяет, что firstName содержит хотя бы один цифро-буквенный символ</li>
6 <li>@NotBlank проверяет, что firstName содержит хотя бы один цифро-буквенный символ</li>
7 <li>@NotNull проверяет, что password не пустой</li>
7 <li>@NotNull проверяет, что password не пустой</li>
8 <li>@Size проверяет, что минимальная длина пароля составляет восемь символов</li>
8 <li>@Size проверяет, что минимальная длина пароля составляет восемь символов</li>
9 </ul><p>Есть и множество других аннотаций. Заранее знать их не нужно, но имеет смысл периодически просматривать их список в<a>спецификации</a>.</p>
9 </ul><p>Есть и множество других аннотаций. Заранее знать их не нужно, но имеет смысл периодически просматривать их список в<a>спецификации</a>.</p>
10 <h2>Автоматическая валидация</h2>
10 <h2>Автоматическая валидация</h2>
11 <p>Валидация выполняется с помощью аннотации @Valid, которая применяется в контроллере:</p>
11 <p>Валидация выполняется с помощью аннотации @Valid, которая применяется в контроллере:</p>
12 <p>Аннотация @Valid идет в паре с @RequestBody. Сама валидация вызывается уже на получившемся объекте, в нашем примере - это user. При успешной валидации вызывается метод контроллера, при неуспешной - возникает исключение MethodArgumentNotValidException. Spring Boot обрабатывает это исключение автоматически и возвращает ошибку<em>400 Bad Request</em>:</p>
12 <p>Аннотация @Valid идет в паре с @RequestBody. Сама валидация вызывается уже на получившемся объекте, в нашем примере - это user. При успешной валидации вызывается метод контроллера, при неуспешной - возникает исключение MethodArgumentNotValidException. Spring Boot обрабатывает это исключение автоматически и возвращает ошибку<em>400 Bad Request</em>:</p>
13 <p>В примере выше обратите внимание на тело запроса. Здесь мы используем для него саму сущность, но в реальном коде там почти наверняка будет использоваться DTO. В этом случае нам придется дополнительно повесить валидацию на DTO:</p>
13 <p>В примере выше обратите внимание на тело запроса. Здесь мы используем для него саму сущность, но в реальном коде там почти наверняка будет использоваться DTO. В этом случае нам придется дополнительно повесить валидацию на DTO:</p>
14 <p>Теперь мы можем заменить сущность на DTO:</p>
14 <p>Теперь мы можем заменить сущность на DTO:</p>
15 <p>На выходе мы получаем аннотации, добавленные в саму сущность и в ее DTO, используемые для создания или обновления. Это неизбежно приводит к дублированию аннотаций, что придется регулярно делать в реальном коде.</p>
15 <p>На выходе мы получаем аннотации, добавленные в саму сущность и в ее DTO, используемые для создания или обновления. Это неизбежно приводит к дублированию аннотаций, что придется регулярно делать в реальном коде.</p>