Walidacja obiektów w Javie.

Temat stary jak świat. Niestety nie każdy umie to zrobić, nie każdy wie jak to zrobić.  Mam obiekt typu X. Czy ten obiekt ma wszystko to, czego od niego oczekuję ? Czy data jest w przeszłości ? Czy pole PESEL jest faktycznie peselem ? Jak to sprawdzić ? Jak znaleźć te błędy ? Postaram się w tym wpisie pokazać jakie to proste 😉

Wymagania

  • Wiedza z zakresu tworzenia projektu maven i dodawania zależności
  • 15 minut wolnego czasu

Konfiguracja

Na początek projekt – utworzymy zwykły projekt mavenowy i dodamy kilka dodatkowych bibliotek do sekcji dependency w pom.xml:

Są to wymagane biblioteki, aby mechanizm walidacji obiektów zadziałał. Sama implementacja mechanizmu walidacji jest w ostatnim wpisie – hibernate-validator, ale może on być inny – bo to tylko implementacja.

Podstawowe walidatory

Definiowanie walidacji obiektu polega na dodaniu odpowiedniej adnotacji do pola klasy.
Domyślnie bez względu na implementację mamy sporo domyślnych adnotacji:

  • AssertFalse – sprawdź, czy pole typu Boolean jest false
  • AssertTrue – sprawdź, czy pole typu Boolean jest true
  • DecimalMax – sprawdź, czy pole typu BigDecimal ma maksymalnie zadaną wartość
  • DecimalMin – sprawdź, czy pole typu BigDecimal/BigInteger ma minimalnie zadaną wartość
  • Digits – sprawdź, czy pole typu BigDecimal/BigInteger posiada maksymalną liczbę cyfr
  • Email – sprawdź, czy pole typu String jest emailem
  • Future – sprawdź, czy pole typu Date jest w przyszłości
  • FutureOrPresent – sprawdź, czy pole typu Date jest teraz lub w przyszłości
  • Max – sprawdź, czy pole numeryczne ma maksymalnie zadaną wartość
  • Min – sprawdź, czy pole numeryczne ma minimalnie zadaną wartość
  • Negative – sprawdź, czy pole numeryczne ma wartość ujemną
  • NegativeOrZero – sprawdź, czy pole numeryczne ma wartość ujemną lub zero
  • NotBlank – sprawdź, czy pole typu String nie jest nullem, oraz czy zawiera co najmniej jeden non-whitespace character
  • NotEmpty – sprawdź, czy pole typu String nie jest nullem, oraz czy nie jest puste
  • NotNull – sprawdź, czy pole nie jest nullem
  • Null – sprawdź, czy pole jest nullem
  • Past – sprawdź, czy pole typu Date jest w przeszłości
  • PastOrPresent – sprawdź, czy pole typu Date jest w teraz lub w przyszłości
  • Pattern – sprawdź, czy pole pasuje do zadanego regexp’a
  • Positive – sprawdź, czy pole numeryczne jest dodatnie
  • PoitiveOrZero – sprawdź, czy pole numeryczne jest zerem lub dodatnie
  • Size – sprawdź, czy pole typu String/List mieści się w zadanych granicach długości

Dodatkowe walidatory

Każda implementacja dodaje też własne dodatkowe walidatory.
W przypadku użytej przeze mnie implementacji Hibernate’a, lista dostępna jest tutaj: https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-defineconstraints-hv-constraints

Użycie

A jak te walidatory użyć? Poprzez proste adnotacje. Utwórzmy przykładową klasę Person:

Definicja klasy

Na każdym polu umieściliśmy odpowiednie adnotacje.

Użycie walidacji

Jak teraz zwalidować taki obiekt?

prosto 😉

 

A teraz po kolei:

Powyższe linijki pobierają instancję walidatora.

Potem tworzymy obiekt Person z jakimiś wartościami raz dobrymi, raz złymi (person i badPerson).

Walidację uruchamiamy poprzez  validator.validate(person)

Metoda ta zwraca nam listę błędów, które sobie potem ładnie na ekran wyświetlamy. Proste, prawda ?

Częściowa walidacja

Czasami potrzebujemy tylko częściowej walidacji. Na przykład czasem pole nip, pesel musimy sprawdzić, a czasem nie. To możemy osiągnąć za pomocą grup.

Utwórzmy najpierw interfejs:

I dodajmy go do naszych adnotacji dla pól pesel i nip w klasie Person:

Jeżeli teraz uruchomimy walidację, to nie wyświetlą się nam błędy dla tych dwóch pól. Jak uruchomić dodatkową walidację tych pól z grupy ?

ano tak –

Czyli dodając klasę pustego interfejsu do metody validate, uruchamiamy dodatkową walidację.

 

Za pomocą walidatorów możemy sprawdzić właściwie wszystko. Dodatkowo, możemy pisać własne walidatory, które sprawdzą nam co tylko chcemy i jak chcemy, ale to temat na kolejny wpis 🙂

 

 

«
»