Разница между @Valid и @Validated в Spring: подробно

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

@Valid применяется для гарантирования стандартной валидации по JSR-380, включающей проверку ограничений свойств объекта.

Java
Скопировать код
public void save(@Valid User user) { /* остальной код метода */ }

Используйте @Validated для применения валидации по группам в Spring. Это даёт возможность настраивать проверки под разные сценарии применения, например, разделять процессы создания и обновления данных.

Java
Скопировать код
public void save(@Validated(OnCreation.class) User user) { /* остальной код метода */ }

Для стандартной валидации @Valid вполне достаточен, но если вам необходимы расширенные функции Spring, такие как валидация на уровне методов и работа с группами ограничений, то выбор в пользу @Validated будет предпочтительнее.

Кинга Идем в IT: пошаговый план для смены профессии

Валидация сценариев с использованием @Valid и @Validated

Аннотация @Valid применяется для базовой валидации когда цель заключается в соответствии объекта установленным требованиям. Например, можно провести валидацию вложенных объектов следующим образом:

Java
Скопировать код
class Order {
    @Valid 
    private Customer customer; // валидация включает вложенный объект
    //...
}

Аннотация @Validated подходит для выполнения более сложных задач валидации. Она предлагает искать различные аспекты объекта в разных контекстах, что актуально при осуществлении частичных обновлений или изменения представлений данных. Вот пример использования групп валидации:

Java
Скопировать код
public interface BasicInfo {}
public interface ExtendedInfo {}

public class User {
    @NotNull(groups = BasicInfo.class)
    private String username;
    
    @NotNull(groups = ExtendedInfo.class)
    @Size(min = 10, groups = ExtendedInfo.class)
    private String biography; 
    //...
}

Создание сложной логики с валидацией на уровне методов

Валидация на уровне методов осуществляется с помощью применения @Validated к классу или интерфейсу, тем самым расширяет возможности проверок на разных уровнях абстракции.

Java
Скопировать код
@Validated 
public class UserService {

    public void updateUser(@Valid User user) { /* остальной код метода */ }

    public void createUser(@Validated(OnCreate.class) User user) { /* остальной код метода */ }
}

В отличие от @Valid, @Validated позволяет реализовывать более сложные проверки на уровне класса.

Управление результатами привязки

@Validated отлично сочетается с BindingResult, обеспечивая управление ошибками валидации. Это очень важно в сложных сценариях обработки форм.

Java
Скопировать код
@PostMapping("/users") 
public String createUser(@Validated User user, BindingResult result) {
    if (result.hasErrors()) {
        // обработка ошибок
        return "form";
    }
    // продолжение транзакции после успешной валидации
    return "success";
}

Визуализация

Две аннотации можно сравнить с процессами обеспечения безопасности в аэропорту:

  • @Valid — это стандартная проверка, которую проходят все пассажиры.
  • @Validated — это специальные проверки для особых случаев и требований.

@Validated:

  • Конфигурируется для определённых групп валидации.
  • Предоставляет валидацию на уровне методов.

@Valid:

  • Фокусируется на стандартной группе валидации.
  • Идеален для каскадной валидации объектов, включенных в другие объекты.

Преодоление сложностей в различных контекстах

@Validated выделяется эффективностью при работе с многоэтапными и динамически меняющимися формами, в которых поля форм и требования к ним могут меняться в ответ на действия пользователя.

Полезные материалы

  1. Spring Framework 6.1.3 API – Validated — Официальная документация Spring для @Validated.
  2. Валидация в Spring Boot – Полное руководство — Подробное руководство по валидации в Spring Boot.
  3. Hibernate Validator 8.0.1.Final – Руководство — Официальная документация Hibernate Validator, часто используемого в связке с Spring.
  4. Использование YAML с @PropertySource в Spring – Stack Overflow — Обсуждение на тему валидации Spring в сообществе разработчиков.
  5. Мгновенный обзор @Valid и @Validated — Анализ Baeldung различий между @Valid и @Validated.