Exceptiony + ResponseEntity

0

Cześć,

otóż głowię się jak poprawnie zwrócić exception np. NOT FOUND przy poprawnym zwracaniu ResponseEntity

oto moja metoda z kontrolera:

@GetMapping("/{id}")
public ResponseEntity<CustomerDTO> getCustomer(@PathVariable Long id) {
        Optional<CustomerDTO> customer = customerService.findById(id);
        return new ResponseEntity<>(customer, HttpStatus.CREATED)
                .orElseThrow(() -> new UserNotFoundException(id));
}

No i tutaj łapię, że orElseThrow nie może zostać wywołany.
Tutaj handler, exception:

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<Object> userNotFound(UserNotFoundException ex) {
        UserNotFoundResponse response = new UserNotFoundResponse(
                HttpStatus.NOT_FOUND.value(),
                ex.getMessage(),
                System.currentTimeMillis()
        );
        return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
    }
}
public class UserNotFoundException extends RuntimeException {

    public UserNotFoundException(Long id) {
        super("User with id: " + id + " not found.");
    }

    public UserNotFoundException(String login) {
        super("User with login: " + login + " not found.");
    }
}

Jak to poprawnie rozwiązać?

Z góry dzięki.

0

Może ten twój exception nie jest runtime?

0

Jest oczywiście to RuntimeException.

0

To w takim razie napisz konkretnie co nie działa, bo ja nie rozumiem w czym jest problem. Czego oczekujesz a co się dzieje? Na oko kod jest ok.

0

Czy przypadkiem nie chodzi o to że się nie kompiluje bo ResponseEntity nie posiada metody .orElseThrow(...)? Tę metodę posiada Optional i jak rozumiem to z niej chcesz skorzystać.

0

Hm, no mój orElseThrow mówi mi tak: Cannot resolve method 'orElseThrow(<lambda expression="expression">). Może jakaś różnica typów?

@up tak mi się wydaje, że to metoda Optional'a, a nie ResponseEntity. Dlatego chcę się dowiedzieć jak to ominąć.

0

No to polecam następnym razem wspomnieć że to błąd kompilacji :-)

Błąd wynika z tego że

return new ResponseEntity<>(customer, HttpStatus.CREATED).orElseThrow(() -> new UserNotFoundException(id));

tutaj wywołujesz na ResponseEntity metode orElseThrow. Sam możesz sprawdzić że takiej metody nie ma ResponseEntity. Prawdodpobonie chodziło ci o to:

return new ResponseEntity<>(customer.orElseThrow(() -> new UserNotFoundException(id)), HttpStatus.CREATED);

Tutaj pobierasz wartosc z Optionala a dopiero potem owijasz to w ResponseEntity. W przypadku braku wartości w Optionalu leci Exception do handlera.

0

Nie wpadłem na takie proste obejście tego.. Zmęczenie doskwiera, wielkie dzięki!

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