Spring- walidacja czy przechwytywanie wyjątków.

0

Cześć, mam zagwozdkę dotyczącą przesyłania danych z formularza, a raczej sytuacji failowych.

W apce mam integrację springa z hibernatem. W encji usera, którego tworzymy za pomocą formularza mam np. takie pole:

@Column(unique = true, nullable = false)
private String username;

I teraz pytanie jak zrobić wyświetlanie informacji "Podany nick już istnieje w systemie", gdzie w miejscu .. będzie pokazane to co wpisał user. Podobnie jeśli wpisze za krótkie hasło lub hasło != confirm.

Mogę zrobić walidację formularzy i poprawność pól będzie już sprawdzana na poziomie wypełniania formularza.

Próbowałem jednak najpierw zrobić za pomocą przechwytywania wyjątków:

@ExceptionHandler(MySQLIntegrityConstraintViolationException.class)
public String exc()
{
	return "redirect:/user/fail";
}

Przechwytuje akurat ten wyjątek, bo to mi wyrzuciło podczas wpisania nazwy usera, która już istnieje.
A nawet gdybym to przechwycił to co mogę zrobić w tej metodzie ? Zwrócić z powrotem nazwę widoku ? Nie mam nawet dostępu do nazwy usera, żeby wypisać tą wiadomość.

Dobrze myślę, że lepszą praktyką jest walidacja formularzy niż przechwycenie wyjątków ? Po prostu chciałbym wiedzieć kiedy używać walidacji a kiedy przechwytywać wyjątki.

Pozdawiam serdecznie

5

Dobrze myślę, że lepszą praktyką jest walidacja formularzy niż przechwycenie wyjątków ? Po prostu chciałbym wiedzieć kiedy używać walidacji a kiedy przechwytywać wyjątki.

Walidować dane wejściowe a nie przechwytywać wyjątki.

Długość hasła itp obsługuj na widoku.
Jeżeli user próbuje wpisać drugi raz ten sam nick - to nie jest wyjątek (w sensie błąd systemowy), tylko sytuacja, która powinna być obsłużona albo w walidatorze podpiętym na widoku albo w serwisie i zwracać komunikat błędu, niemniej sprawdzać warunek.

0

tak jak mówi @szarotka walidować. chociaż zastanawiam się co jak nie uda się zacommitować transakcji i poleci jakiś wyjątek z hibernate. czy go wtedy łapać i spróbować powtórzyć commita czy wyświetlić komunikat użytkownikowi. przypadek gdy baza jest obciążona i korzysta z niej wiele rzeczy jednocześnie

0

@szarotka

Nie wiem czy myślimy o takiej samej walidacji. Ja do tego pory czytałem, że dodaję sobie adnotacje nad pole, np:

@Size ( min = 5, max = 10 )

i potem w obsłudze metody POSTa zwracam ponownie nazwę widoku formularza ale już z błędami.

O, jak tu:

https://spring.io/guides/gs/validating-form-input/

W jaki sposób sprawdzasz duplikacje za pomocą walidacji ?

2

@Bambo wszystkich takich rzeczy nie załatwisz tą walidacją metodą wiesz polegającą tylko na tych adnotacjach z JSR-303.

jak masz jakąś biznesową walidację, która wymaga użycia innych biznesów albo właśnie taką czy taka nazwa czasem nie istnieje już w bazie to
zrób sobie jakiegoś walidatora. po prostu w walidatorze używasz dao do którego dorobisz metode isExistByName albo findByName czy coś w tym stylu.

generalnie spójrz koniecznie na to:
http://stackoverflow.com/questions/12146298/spring-mvc-how-to-perform-validation

same adnotacje JPA do walidacji to słabe są. wgl to masz dziwny nick. Czy jeszcze czegoś nie kumasz?!!!

0

chociaż zastanawiam się co jak nie uda się zacommitować transakcji i poleci jakiś wyjątek z hibernate. czy go wtedy łapać i spróbować powtórzyć commita czy wyświetlić komunikat użytkownikowi. przypadek gdy baza jest obciążona i korzysta z niej wiele rzeczy jednocześnie

Trochę cię poniosło @karolinaa.

0

My np idziemy w wyjątki. A to co robi klient to jego sprawa. Warstwa biznesowa/logiki ma kontrakt czyli doda użytkownika o mailu który jeszcze nie istnieje w systemie + ma odpowiednią długość hasła. Niespełenienie jednego z dwóch warunków = wyjątek. I teraz klient sobie go interpretuje w dowolnej formie. Zazwyczaj jakiś exception handler który zapala lampki przy polach. Jeżeli klient umie dodatkowo wymóc długość hasła to fajnie....

0

A ja jeszcze mam pytanie. Walidator powinien być w kontrolerze czy serwisie ? Tzn czy w kontrolerze w metodzie mam sprawdzać blędy i albo wywołać serwis dodania podczas braku błędów czy też w metodzie serwisowej mam sprawdzać błędy za pomocą walidatora i w razie ich wystąpienia zwracać null ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1