Buduję prostą aplikację webową. Zastanawiam się, jakie części kodu gdzie umieścić, jeśli chodzi o zwracanie błędów od strony serwera.
Jest prosty kontroler, przyjmuje ResponseBody, które ma zapisać do bazy danych. Przyjmuje obiekt, waliduje go, w razie błędów zwraca odpowiednie ResponseEntity.
Oprócz tego chciałbym uprościć kontroler do wywołania samych metod serwisu. Przykładowy kod niżej:
public ResponseEntity<?> register(@Validated(Account.AccountValidation.class) @RequestBody Account account,
BindingResult result) {
if (result.hasErrors()) {
return ErrorMessage.send(result, HttpStatus.BAD_REQUEST);
}
Account account1 = accountService.addNewAccount(account);
if(account1 == null){
return ErrorMessage.send("Not created. Error!", HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(account1, HttpStatus.OK);
}
Jeśli chodzi o same errory bindowania pól błędy zwraca poprawnie, ale zastanawiam się, jak przekazać błędy od serwera, tzn. mamy prosty przykład zakładania konta w serwisie:
public Account addNewAccount(Account account){
if(!accountRepository.findAccountsByUsernameOrEmail(account.getUsername(), account.getEmail()).isEmpty()){
return null;
}
return accountRepository.save(account);
}
Konto może nie być założone, jeśli konto o podanym emailu lub loginie już w systemie istnieje - serwis zwraca null. Konto może nie być założone także, gdy wyniknie jakiś błąd w czasie samego zapisu. I teraz pytanie? W jaki sposób rozdzielić zwrócone informacje, żeby do użytkownika dać informację, czy konto nie zostało założone przez to, że podał już istniejące w systemie dane czy np. przez błąd samego zapisu?
Nie wydaje mi się, żeby metoda serwisu miała zwracać ResponseEnitity, bo estetyczne to nie będzie. Z kolei obsługa tego w kontrolerze to dobry pomysł? Wtedy muszę dodać dodatkową metodę w serwisie (albo wywołać tą z repozytorium) pobrać dane, sprawdzić i jak nie będzie takiego użytkownika wykonać metodę serwisu dodającą użytkownika, ale czy tam się robi? Jak to powinno poprawnie wyglądać?