Chciałbym wiedzieć, jaki jest najczystszy i najlepszy sposób przeprowadzania walidacji formularza danych wprowadzanych przez użytkownika. Widziałem, jak niektórzy programiści wdrażali org.springframework.validation.Validator
. Pytanie na ten temat: widziałem, że waliduje klasę. Czy klasa musi być wypełniona ręcznie wartościami z danych wprowadzonych przez użytkownika, a następnie przekazana do walidatora?
Jestem zdezorientowany co do najczystszego i najlepszego sposobu sprawdzania poprawności danych wejściowych użytkownika. Wiem o tradycyjnej metodzie używania, request.getParameter()
a następnie ręcznego sprawdzania nulls
, ale nie chcę wykonywać wszystkich weryfikacji w moim Controller
. Bardzo cenne będą dobre rady w tej dziedzinie. Nie używam Hibernacji w tej aplikacji.
źródło
Odpowiedzi:
W Spring MVC istnieją 3 różne sposoby przeprowadzania walidacji: przy użyciu adnotacji, ręcznej lub mieszanej. Nie ma unikalnego „najczystszego i najlepszego sposobu” weryfikacji, ale prawdopodobnie jest taki, który lepiej pasuje do twojego projektu / problemu / kontekstu.
Miejmy użytkownika:
Metoda 1: Jeśli masz Spring 3.x + i prostą weryfikację do wykonania, użyj
javax.validation.constraints
adnotacji (znanych również jako adnotacje JSR-303).Będziesz potrzebował dostawcy JSR-303 w swoich bibliotekach, takiego jak Hibernate Validator, który jest implementacją referencyjną (ta biblioteka nie ma nic wspólnego z bazami danych i mapowaniem relacyjnym, po prostu wykonuje walidację :-).
Wtedy w kontrolerze miałbyś coś takiego:
Zwróć uwagę na @Valid: jeśli użytkownik ma pustą nazwę, result.hasErrors () będzie true.
Metoda 2: Jeśli masz złożoną walidację (taką jak logika walidacji dużych firm, walidacja warunkowa w wielu polach itp.) Lub z jakiegoś powodu nie możesz użyć metody 1, użyj walidacji ręcznej. Dobrą praktyką jest oddzielenie kodu kontrolera od logiki walidacji. Nie twórz swoich klas walidacji od zera, Spring zapewnia wygodny
org.springframework.validation.Validator
interfejs (od Spring 2).Powiedzmy, że masz
i chcesz przeprowadzić „złożoną” walidację, na przykład: jeśli użytkownik ma mniej niż 18 lat, odpowiedzialnyUser nie może być zerowy, a odpowiedzialny użytkownik musi mieć ukończone 21 lat.
Zrobisz coś takiego
Wtedy w kontrolerze miałbyś:
Jeśli wystąpią błędy walidacji, wartość result.hasErrors () będzie true.
Uwaga: Możesz również ustawić walidator w metodzie @InitBinder kontrolera, z "binder.setValidator (...)" (w takim przypadku użycie metody 1 i 2 nie byłoby możliwe, ponieważ zastępujesz domyślną walidator). Lub możesz utworzyć instancję w domyślnym konstruktorze kontrolera. Możesz też mieć @ Component / @ Service UserValidator, który wstrzykujesz (@Autowired) do kontrolera: bardzo przydatne, ponieważ większość walidatorów to pojedyncze + testy jednostkowe stają się łatwiejsze + Twój walidator może wywoływać inne komponenty Spring.
Metoda 3: Dlaczego nie użyć kombinacji obu metod? Zweryfikuj proste rzeczy, takie jak atrybut „nazwa”, za pomocą adnotacji (jest to szybkie, zwięzłe i bardziej czytelne). Zachowaj ciężkie walidacje dla walidatorów (kiedy kodowanie niestandardowych złożonych adnotacji walidacyjnych zajmie wiele godzin lub tylko wtedy, gdy nie można użyć adnotacji). Zrobiłem to w poprzednim projekcie, zadziałało jak urok, szybko i łatwo.
Ostrzeżenie: nie należy pomyłka obsługa walidacji dla obsługi wyjątków . Przeczytaj ten post, aby dowiedzieć się, kiedy ich używać.
Bibliografia :
źródło
Istnieją dwa sposoby sprawdzania poprawności danych wejściowych użytkownika: adnotacje i dziedziczenie klasy Validator Springa. W prostych przypadkach adnotacje są ładne. Jeśli potrzebujesz złożonych walidacji (takich jak walidacja między polami, np. Pole „zweryfikuj adres e-mail”) lub jeśli Twój model jest sprawdzany w wielu miejscach w aplikacji z różnymi regułami lub jeśli nie masz możliwości modyfikowania model poprzez umieszczenie na nim adnotacji, Validator oparty na dziedziczeniu Springa jest drogą do zrobienia. Pokażę przykłady obu.
Rzeczywista część walidacji jest taka sama, niezależnie od tego, jakiego typu walidacji używasz:
Jeśli używasz adnotacji, Twoja
Foo
klasa może wyglądać następująco:Powyższe
javax.validation.constraints
adnotacje to adnotacje. Możesz także użyć Hibernacjiorg.hibernate.validator.constraints
, ale wygląda na to, że nie używasz Hibernacji.Alternatywnie, jeśli zaimplementujesz Validator Springa, możesz utworzyć klasę w następujący sposób:
Jeśli używasz powyższego walidatora, musisz również powiązać walidator z kontrolerem Spring (nie jest to konieczne, jeśli używasz adnotacji):
Zobacz także dokumentację Spring .
Mam nadzieję, że to pomoże.
źródło
Foo
parametrem w metodzie obsługi. Możesz wyjaśnić?Chciałbym udzielić miłej odpowiedzi Jerome'a Dalberta. Znalazłem bardzo łatwe pisanie własnych walidatorów adnotacji w sposób JSR-303. Nie jesteś ograniczony do walidacji „jednego pola”. Możesz stworzyć własną adnotację na poziomie typu i mieć złożoną walidację (zobacz przykłady poniżej). Wolę ten sposób, ponieważ nie potrzebuję mieszać różnych typów walidacji (Spring i JSR-303), jak robią to Jerome. Również te walidatory są "świadome wiosny", więc możesz używać @ Inject / @ Autowire po wyjęciu z pudełka.
Przykład weryfikacji obiektu niestandardowego:
Przykład równości pól ogólnych:
źródło
ElementType.METHOD
w@Target
.Jeśli masz taką samą logikę obsługi błędów dla różnych programów obsługi metod, otrzymasz wiele programów obsługi z następującym wzorcem kodu:
Załóżmy, że tworzysz usługi RESTful i chcesz powrócić
400 Bad Request
wraz z komunikatami o błędach dla każdego przypadku błędu walidacji. Następnie część obsługi błędów byłaby taka sama dla każdego punktu końcowego REST, który wymaga weryfikacji. Powtarzanie tej samej logiki w każdym programie obsługi nie jest takie SUCHE !Jednym ze sposobów rozwiązania tego problemu jest porzucenie natychmiast
BindingResult
po każdym ziarnie podlegającym walidacji . Teraz twój handler wyglądałby tak:W ten sposób, jeśli związana fasola nie była ważna,
MethodArgumentNotValidException
wiosną zostanie wyrzucony testament. Możesz zdefiniować a,ControllerAdvice
który obsługuje ten wyjątek z tą samą logiką obsługi błędów:Nadal możesz zbadać podstawę
BindingResult
przy użyciugetBindingResult
metodyMethodArgumentNotValidException
.źródło
Znajdź pełny przykład weryfikacji Spring Mvc
źródło
Umieść to ziarno w swojej klasie konfiguracji.
a następnie możesz użyć
do ręcznego sprawdzania poprawności ziarna. Następnie otrzymasz wszystkie wyniki w BindingResult i możesz je pobrać.
źródło