Java for Beginner
675 subscribers
558 photos
156 videos
12 files
851 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Валидация и валидационные аннотации в Spring

Валидация данных — это важная часть разработки любого приложения. Валидационные аннотации позволяют легко проверить входные данные, обеспечивая их корректность перед тем, как они попадут в логику приложения. Spring поддерживает валидацию с использованием Java Bean Validation API (JSR-303) и предоставляет аннотации для автоматической проверки данных.

1. Основы валидации в Spring


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

Для использования валидации в Spring необходимо добавить зависимость spring-boot-starter-validation в проект:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>


2. Основные валидационные аннотации

2.1. Аннотация
@NotNull

Аннотация @NotNull проверяет, что значение поля не равно null.
import javax.validation.constraints.NotNull;

public class User {

@NotNull(message = "Имя не должно быть пустым")
private String name;

// Геттеры и сеттеры
}


2.2. Аннотация @Size

Аннотация @Size используется для ограничения длины строки или размера коллекции.
import javax.validation.constraints.Size;

public class User {

@Size(min = 3, max = 20, message = "Имя должно быть от 3 до 20 символов")
private String name;

// Геттеры и сеттеры
}


2.3. Аннотация @Email

Аннотация
@Email проверяет, что значение соответствует формату email-адреса.
import javax.validation.constraints.Email;

public class User {

@Email(message = "Неверный формат email")
private String email;

// Геттеры и сеттеры
}


2.4. Аннотация @Min и @Max

Эти аннотации проверяют минимальное и максимальное значение числового поля.
import javax.validation.constraints.Min;
import javax.validation.constraints.Max;

public class Product {

@Min(value = 1, message = "Цена должна быть больше 0")
@Max(value = 1000, message = "Цена не должна превышать 1000")
private int price;

// Геттеры и сеттеры
}


3. Пример валидации DTO в Spring

Предположим, у нас есть класс UserDTO, который представляет данные пользователя, получаемые через форму.
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Email;

public class UserDTO {

@NotNull(message = "Имя не может быть пустым")
@Size(min = 3, max = 50, message = "Имя должно быть от 3 до 50 символов")
private String name;

@NotNull(message = "Email не может быть пустым")
@Email(message = "Неправильный формат email")
private String email;

// Геттеры и сеттеры
}


Теперь создадим REST-контроллер, который будет обрабатывать запросы на регистрацию пользователя.
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import org.springframework.http.ResponseEntity;

@RestController
@RequestMapping("/api/users")
public class UserController {

@PostMapping("/register")
public ResponseEntity<String> registerUser(@Valid @RequestBody UserDTO user) {
return ResponseEntity.ok("Пользователь успешно зарегистрирован");
}
}
Здесь @Valid указывает Spring на необходимость выполнить валидацию объекта UserDTO перед тем, как продолжить выполнение метода. Если данные не пройдут проверку, Spring автоматически вернет ошибку 400 (Bad Request) с описанием нарушений.


#Java #Training #Spring #NotNull #Size #Email #Min #Max
4. Кастомные аннотации валидации

Spring позволяет создавать собственные аннотации для валидации. Например, мы можем создать аннотацию для проверки уникальности email.

4.1. Создание кастомной аннотации

Определим аннотацию
@UniqueEmail.
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = UniqueEmailValidator.class)
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UniqueEmail {

String message() default "Email уже используется";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}


Реализуем валидатор.
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {

@Override
public boolean isValid(String email, ConstraintValidatorContext context) {
// Логика проверки уникальности email
return !email.equals("existingemail@example.com");
}
}


Используем нашу кастомную аннотацию.
public class UserDTO {

@UniqueEmail
private String email;

// Геттеры и сеттеры
}


#Java #Training #Spring #NotNull #Size #Email #Min #Max