Własne walidatory w Javie

W poprzednim wpisie pokazałem w jaki sposób walidować obiekty w Javie. Mamy dostępnych sporo domyślnych walidatorów, ale w jaki sposób napisać własny walidator ? Postaram się to pokazać na kilku prostych przykładach.

Wymagania

  • Podstawowa znajomość tematu walidacji
  • Wiedza z zakresu tworzenia projektu maven i dodawania zależności
  • 15 minut wolnego czasu

Źródła

Źródła do tego wpisu, są dostępna na github: https://github.com/najavie/beanValidationExample

Konfiguracja

Tworzymy projekt maven, i dodajemy następujące zależności:

Implementacja

Enum Gender

Tworzymy enuma Gender:

Klasa Address

Tworzymy klasę Address:

Klasa Person

Tworzymy klasę Person ze standardowymi walidatorami:

Klasa Person ma dodatkową metodę, która pobiera płeć z pesela. Płeć leży na 10 elemencie, i jeśli 10 element jest parzysty, to mamy kobietę, a jeśli nieparzysty, to mamy faceta. Proste 🙂

Baza imion

Utworzymy sobie jeszcze jakieś małe repozytorium imion. W realnej aplikacji, to będzie zapewne baza danych, ale na nasze potrzeby wystarczy nam coś takiego:

GenderName będzie reprezentowało informację o imieniu oraz płci.

NameRepository zawiera listę kilku imion w połączeniu z płcią.

Adnotacja @CorrectName

Utworzymy teraz pierwszą własną adnotację – @CorrectName.

Adnotację chcemy nałożyć na imię, czyli pole String.

Chcemy też otrzymać jakiś komunikat.

Struktura jest w miarę logiczna.

Musimy do adnotacji utworzyć też implementację walidatora, którego definiujemy poprzez:

No to zróbmy to!

Nasz walidator musi implementować ConstraintValidator sparametryzowany typem adnotacji oraz typem, jaki będzie walidował.

W metodzie initialize() możemy zainicjować jakieś dodatkowo nam potrzebne elementy. W tym przypadku, nic takiego nie potrzebujemy…

No i musimy zaimplementować metodę isValid(), która dokona już naszej walidacji imienia.
Walidacja ma polegać na tym, że akceptujemy tylko te pola, które mają imiona, które mamy w naszej „bazie danych”.
I to robimy:

Nic trudnego 🙂

Nakładamy teraz naszą walidację na pole name w Person:

I tyle 🙂

To zróbmy jeszcze kilka walidatorów…

Adnotacja @Adult

I jej implementacja:

Tutaj jak widzimy, nakładamy się na datę, i sprawdzamy, czy ktoś jest pełnoletni. Nie chcemy, aby 8mio letni Brajanek zrobił zakupy w naszym sklepie, prawda ?

Adnotacja @CorrectNameAndGender

A teraz trochę trudniej. Chcemy sprawdzić, czy imie pasuje do płci z pesela. Nie chcemy, aby Brajanek okazał się Jessicą, prawda?

Tutaj nie nałożymy adnotacji na pole, ale na całą klasę Person, aby mieć dostęp do wszystkich jej pól:

I implementacja:

Banalne, prawda ?

Jeszcze pozostał nam adres.

Adnotacja @Valid

Adnotacja @Valid, jest już zaimplementowana. Służy ona do tego, aby powiedzieć walidatorowi, że ma również inny obiekt zwalidować. Inaczej tego nie zrobi.

Czyli:

Spowoduje, że będziemy walidowali pole address. W innym przypadku ten obiekt to nie byłby walidowany. Jest to częsty błąd i łatwo zapomnieć o tej adnotacji 🙂

 

No to napiszmy trochę testów, tak jak zasugerował mi w jednym komentarzu pewien czytelnik 🙂

To tyle.

Jak widać, można w dość prosty sposób napisać własne walidatory, które sprawdzą nasz obiekt od góry do dołu. Zaoszczędzi nam to dużej ilości błędów później, bo nie będziemy mieli sytuacji, że jakieś pole jest nullem, a nigdy nie powinno być, że jakiś 11-to letni chłopczyk dokona zakupów, bo nie zwalidowaliśmy odpowiednio pesela, czy też imię będzie prawidłowe, a nie jakimś zlepkiem randomowych ciągów znaków.

 

«
»