Wyjątki i REST-owe kody błędów

0

Elo wszystkim :) przejdę od razu do problemu, mam metodę restową get w której podaje id i dostaje zasób. Gdy znajduję mi zasób wszystko jest ok dostaję status code 200 a w body mam dany zasób. Gdy danego zasobu nie ma powinno rzucić status code 404 a wyrzuca mi 500 Internal Server Error z wyjątkiem z serwisu który obsługuję całą logikę. Jak poprawnie obsłużyć takie żądanie ?

metoda w kontrolerze

 @GetMapping("/api/jobs/{id}")
    public ResponseEntity<?> getSingleJob(@PathVariable("id") Long id) {
        return jobOfferService.getSingleJobById(id)
                .map(offer -> ResponseEntity
                        .ok()
                        .location(URI.create("/api/jobs/" + offer.getId()))
                        .body(offer))
                .orElseThrow(()-> new ResponseStatusException(NOT_FOUND, "No job offers with this id found !"));
    }

metoda z serwisu

 public Optional<JobDto> getSingleJobById(long id) {
        return Optional.of(JobDtoMapper.mapToJobDto(jobRepository.findById(id)
                 .orElseThrow(() -> new JobExceptionHandler("No job offers with this id found !"))));
    }
0

Niepotrzebnie rzucasz wyjątkiem. Skoro getSingleJobById zwraca Optionala to znaczy, że puste wartości są dopuszczalne. Wtedy powinieneś zwrócić po prostu pustą wartość, co Optional.of załatwia sam.

0

Nie rozumiem to mam nie rzucać tego wyjątku w serwicie czy w kontrolerze. Jak nie rzuce tego wyjąyku w kontrolerze to i tak mi rzuca 500 gdy nie ma zasobu a jak w serwisie to też.

1

Wygląda na to, że findById też zwraca optional? Tak to widzę (pisane na sucho, mogłem pomieszać składnię):

 public Optional<JobDto> getSingleJobById(long id) {
        return jobRepository.findById(id).map(JobDtoMapper::mapToJobDto);
    }
0

No tak dziękówa teraz zwraca 404 :) Takie małe pytanko jeszcze chodzi o tą metodę w kontrolerze czy to jest poprawny sposób w jaki się zwraca statusy kodów błędów ? Wiesz z repo do serwisu przekazuje optionala , z serwisu do kontrelera też optionala, czyli nie obsługiać takich błędów w serwisie niby też do tego stworzyłem ten serwis :)

1

Jak dla mnie tak.

Esteci by się doczepili, że to kontrola przez wyjątki i lepiej by było zbudować ResponseEntity z 404 zamiast tego. Aczkolwiek w tym wypadku to i tak jest praktycznie idiom Springa i zapytanie kończy się błędem, więc nie ma się co czepiać.

1

Zamień se w controllerze to całe budowanie optionala, na ResponseEntity.of(optiona). To zwraca 200 jak cos jest i 404 jak nie ma

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