Шаблон проектирования обработки исключений на уровне службы и контроллера

Итак, вот моя текущая реализация конечной точки rest-api, я хотел бы обрабатывать некоторые угловые случаи, например, пользователь или квартира не найдены, поэтому я бы выдал подходящее исключение, но как показать, что я обрабатываю его в контроллер? На данный момент это не совсем работает, если я установлю несуществующий идентификатор, он будет работать как обычно, и я не получу соответствующее сообщение об ошибке.

Сервисный уровень:

public void delete(Long flatId) {
        flatRepository.findById(flatId).ifPresentOrElse(flat -> {
                    List<User> residents = flat.getResidents();
                    residents.forEach(resident -> resident.setFlat(null));
                    flatRepository.delete(flat);
                },
                () -> new ResourceNotFoundException("Flat " + flatId + " found"));

}

Уровень контроллера:

@DeleteMapping("/flats/{flatId}")
    public void deleteFlat(@PathVariable Long flatId) {
        flatService.delete(flatId);
}

Глобальный обработчик исключений:

@ControllerAdvice
@RestController
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public final ErrorDetails handleResourceNotFoundException(ResourceNotFoundException ex) {
        return new ErrorDetails(LocalDateTime.now(), ex.getMessage(), 404);
    }

    @ExceptionHandler(ResourceAlreadyDefinedException.class)
    @ResponseStatus(HttpStatus.CONFLICT)
    public final ErrorDetails handleResourceAlreadyDefinedException(ResourceAlreadyDefinedException ex) {
        return new ErrorDetails(LocalDateTime.now(),  ex.getMessage(), 409);
    }

}

Обновление: я создал этот глобальный обработчик исключений, но если я отправлю запрос на удаление моему API с несуществующим идентификатором, он не отправит мне 404, а просто ответит 200. Хотя, если у меня есть возвращаемое значение, как в этом случае , он работает так, как ожидалось.

        public Flat get(Long id) {
                return flatRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Flat " + id + " not found"));
        }


     @GetMapping("/flats/{flatId}")
        public ResponseEntity<Flat> getFlat(@PathVariable Long flatId) {
            return ResponseEntity.ok(flatService.get(flatId));
     }

У меня есть ответ: stackoverflow.com/questions/53762829/…, надеюсь, это поможет

Cocuthemyth 14.02.2019 20:32

@Cocuthemyth обновил мой пост!

Bence Szabari 15.02.2019 10:46
2
2
7 128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать @ControllerAdvice с @ExceptionHandler для реализации глобальной обработки исключений для всех контроллеров и для определенного типа исключений.

Посмотрите здесь для примеров.

Другие вопросы по теме