Gdzie co umieścić? Spring + Java

0

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ć?

0

Są dwa sposoby lepszy i gorszy
gorszy to sterowanie wyjątkami, czyli jest konto w systemie to rzucasz UsernameAlreadyExistsException i w springu sobie to obsługujesz w dowolny sposób np ExceptionHandler. Jest też drugi sposób, gdzie metoda serwisu addNewAccount nie zwraca Account tylko np .AccountCreationResult. Sposób implementacji dowolny, ale AccountCreationResult powinien zwrócić informację czy operacja zakończyła się sukcesem i wtedy zwrócic utworzone konto lub w przeciwnym razie komunikat/obiekt błędu, który będzie jasny dla programisty, który sobie to obsłuży w kontrolerze i zrobi z niego jasny przekaz dla użytkownika.

Nie wydaje mi się, żeby metoda serwisu miała zwracać ResponseEnitity, bo estetyczne to nie będzie.

wtedy serwis będzie miał zależność do warstwy infrastruktury, więc nic dobrego z tego nie będzie

Z kolei obsługa tego w kontrolerze to dobry pomysł?

logika w kontrolerze to też nie jest dobry pomysł, bo będziesz miał logikę w warstwie infrastruktury, przez co granica między warstwami zacznie się zacierać, a kontroler będzie miał więcej odpowiedzialnosci niż powinien

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