0Pricing
Java Academy · Lekcja

Walidacja beanów: @NotNull, @Size, @Pattern

Proszę oznaczać DTO ograniczeniami Bean Validation i uruchamiać walidację za pomocą @Valid w kontrolerach.

Walidacja beanów: @NotNull, @Size, @Pattern to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Czym jest Bean Validation?

Bean Validation (Jakarta Bean Validation 3.0) udostępnia deklaratywne adnotacje ograniczeń dla komponentów Java. Spring Boot automatycznie konfiguruje walidator i uruchamia go za pomocą @Valid lub @Validated.

@NotNull, @NotEmpty, @NotBlank

@NotNull: wartość nie może być null. @NotEmpty: wartość nie może być null ani pusta (w przypadku napisów i kolekcji). @NotBlank: wartość nie może być null, pusta ani składać się wyłącznie z białych znaków. W przypadku napisów należy preferować @NotBlank.

public record CreateUserRequest(
    @NotBlank(message = "Name is required")
    String name,
    @NotBlank @Email
    String email,
    @NotNull
    UserRole role
) {}

@Size i @Length

@Size(min, max) ogranicza rozmiar napisów, kolekcji, map i tablic. @Length (Hibernate) działa wyłącznie na napisach. Dla zapewnienia przenośności należy preferować @Size.

@Size(min = 3, max = 50, message = "Name must be 3-50 characters")
private String name;
@Size(min = 1, max = 10, message = "Cart must have 1-10 items")
private List<CartItem> items;

@Min, @Max, @Positive, @Range

Ograniczenia liczbowe: @Min/@Max służą do określania dokładnych granic, @Positive/@PositiveOrZero do określania znaku, a @DecimalMin/@DecimalMax do wartości BigDecimal.

@Min(1) @Max(100)
private int quantity;
@DecimalMin("0.01") @DecimalMax("99999.99")
private BigDecimal price;
@Positive
private long orderId;

@Pattern do walidacji wyrażeń regularnych

@Pattern(regexp) sprawdza napisy względem wyrażenia regularnego. Jest przydatne w przypadku numerów telefonów, kodów pocztowych i niestandardowych formatów.

@Pattern(regexp = "^\\+?[1-9]\\d{7,14}$", message = "Invalid phone number")
private String phone;
@Pattern(regexp = "^[A-Z]{2}\\d{5}$", message = "Invalid postal code (e.g. AB12345)")
private String postalCode;

@Email i @URL

@Email sprawdza format adresu e-mail (podstawowy RFC 5321). @URL (Hibernate) sprawdza format adresu URL. Należy zawsze łączyć te adnotacje z @NotBlank, ponieważ dopuszczają wartość null.

@NotBlank @Email
private String email;
// Hibernate-specific:
@URL(protocol = "https")
private String profileUrl;

@Past, @Future, @PastOrPresent

Ograniczenia czasowe sprawdzają wartości daty i czasu. Działają z typami LocalDate, LocalDateTime, Instant i innymi.

@Past(message = "Birth date must be in the past")
private LocalDate birthDate;
@Future(message = "Expiry must be in the future")
private LocalDate expiryDate;

Uruchamianie walidacji za pomocą @Valid

Do parametru metody kontrolera należy dodać @Valid. Spring zwaliduje obiekt, a w przypadku niepowodzenia zgłosi MethodArgumentNotValidException i zwróci odpowiedź 400 Bad Request.

@PostMapping("/users")
public ResponseEntity<UserDto> create(@Valid @RequestBody CreateUserRequest req) {
    User user = userService.create(req);
    return ResponseEntity.status(201).body(UserDto.from(user));
}

Kaskadowa walidacja za pomocą @Valid na polach

Aby walidować zagnieżdżone obiekty, należy oprócz ograniczeń na poziomie klasy oznaczyć pole adnotacją @Valid.

public record OrderRequest(
    @NotNull @Valid
    AddressRequest shippingAddress, // validates AddressRequest constraints too
    @Valid @NotEmpty
    List<@Valid LineItemRequest> items
) {}

Grupy walidacji

Grupy pozwalają stosować różne ograniczenia w różnych kontekstach (np. podczas tworzenia i aktualizacji). Należy oznaczyć ograniczenie interfejsem grupy i uruchomić je za pomocą @Validated(CreateGroup.class).

public interface CreateGroup {}
public interface UpdateGroup {}
public record UserRequest(
    @NotBlank(groups = CreateGroup.class) String password,
    @NotNull(groups = UpdateGroup.class)  Long id
) {}
// Controller:
@PutMapping("/{id}")
public UserDto update(@Validated(UpdateGroup.class) @RequestBody UserRequest req) { ... }

Odczytywanie błędów walidacji

Należy przechwycić MethodArgumentNotValidException w @ControllerAdvice, aby wyodrębnić błędy pól i utworzyć strukturyzowane odpowiedzi błędów.

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidation(MethodArgumentNotValidException ex) {
    Map<String, String> errors = new LinkedHashMap<>();
    ex.getBindingResult().getFieldErrors().forEach(e ->
        errors.put(e.getField(), e.getDefaultMessage()));
    return ResponseEntity.badRequest().body(errors);
}

Szybkie sprawdzenie

Która adnotacja sprawdza, czy String jest różny od null ORAZ nie jest pusty ani złożony wyłącznie z białych znaków?

Podsumowanie

DTO należy oznaczać ograniczeniami Bean Validation. Aby uruchomić walidację, należy dodać @Valid w kontrolerach. Należy używać @NotBlank dla napisów, @Size do sprawdzania długości, @Pattern do wyrażeń regularnych oraz @Past/@Future dla dat. Błędy należy obsługiwać w @ControllerAdvice.

Często zadawane pytania

Czy lekcja „Walidacja beanów: @NotNull, @Size, @Pattern” jest bezpłatna?

Tak — pełny tekst „Walidacja beanów: @NotNull, @Size, @Pattern” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Walidacja beanów: @NotNull, @Size, @Pattern”?

Proszę oznaczać DTO ograniczeniami Bean Validation i uruchamiać walidację za pomocą @Valid w kontrolerach. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Walidacja beanów: @NotNull, @Size, @Pattern”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Walidacja beanów: @NotNull, @Size, @Pattern
  2. Niestandardowe adnotacje ograniczeń
  3. Globalna obsługa wyjątków za pomocą @ControllerAdvice
  4. Szczegóły problemu RFC 7807 i spójne odpowiedzi błędów
← Powrót do Java Academy