sprawdzenie czy taki rekord istnieje w bazie

0

witajcie, napisałem sobie stronę gdzie chce rejestrować nowego uzytkownika w springu bootcie i hibernate. Chciałbym sprawdzić czy nie ma już przypadkiem takiego maila w bazie i czy "nowy" się nie powtarza.

w klasie user.java mam Stringa email i dałem unique i bazie też nadałem atrybut unique w tym polu

    @Column(unique=true)
    private String email;

później w kontrolerze sprawdzam sobie to tak:

	@PostMapping("/registration")
	  public String createPerson(String email, String name, @Valid User user, BindingResult bindingResult) {
		
	      user.setEmail(email);
	      user.setName(name);

		if (bindingResult.hasErrors() ) {
		return "registration";
	}

ale to nie działa. Tzn. działa, ale zamiast wracać do formularza(thymeleaf) i pokazać błąd to wywala:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
There was an unexpected error (type=Internal Server Error, status=500).
could not execute statement; SQL [n/a]; constraint [email_UNIQUE]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

Pomocy, bo utknąłem, pozdrawiam

0

Masz wyraźnie napisane, że wystąpił nieobsługiwany błąd. Obsłuż go i problem z głowy.

0

A to nie da rady jakos prosciej tego napisac, tylko trzeba sie uciekac do obslugi wyjatkow? Jak tak, to troche lipa ze spring nie wspiera takiego prostego create'a.
Mozecie mi napisac albo zalinkowac jakis przyklad, jak ten wyjatek ogarnac, tak zeby mi nie przeladowywalo strony? Przeczytalem troche manuala ale jedynie co udalo mi sie teraz zrobic to zamiana tego bledu na wlasna wiadomosc.

0

No właśnie w Springu bardzo ładnie obsługujesz sobie wyjątki używając ControllerAdvice i ExceptionHandler (tutoriali mnóstwo). Ja bym wolał, żeby takie zapytanie szło po REST, ale oczywiście możesz zwrócić statyczną stronkę Thymeleaf z komunikatem o błędzie.

0

Napisz jaka technologia wspiera takiego prostego create?

0

dobra, później sprawdze jeszcze dokładniej ten ControllerAdvice i ExceptionHandler
na razie napisałem taką klasę

@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR, reason = "zajęty")
public class ExistException extends RuntimeException { 
(...)
}
 if( userRepository.findByEmail(user.getName()) != null)throw new ExistException(user.getName());

ale to mi nie działa tak jakbym chciał, bo również wywala Whitelabel Error Page tylko teraz z "zajęty" nadpisał

Szczery napisał(a):

Napisz jaka technologia wspiera takiego prostego create?

w php np. formularze na bieżąco bez klikania, co do znaku, sprawdzają czy zajęty nick.
Nie chce tu narzekać, tylko dali tą adnotację @Column(unique=true), która wykonała i tak zapytanie sql, to moga zwracać - tak samo jak np. @NotEmpty a nie zaraz z wyjątkiem się trzeba bawić. Muszę się douczyć. Pozdrawiam.

0

w php np. formularze na bieżąco bez klikania, co do znaku, sprawdzają czy zajęty nick.

I oczywiście odbywa się to bez zapytania? ;)

Muszę się douczyć. Pozdrawiam.

Musisz. Pozdrawiam.

Pokazałeś, jak zmapować wyjątek na response, ale nigdzie nie złapałeś. Nie masz zdefiniowanej defaultowej strony błędu, stąd Whitelabel error.

0

Nie wiadomo jak zarzadzasz transakcjami, co masz w bazie danych nie mamy kryształowej kuli zeby sprawdzić

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