Шаблон проектирования обработки исключений на уровне сервисов и контроллеров - PullRequest
0 голосов
/ 13 февраля 2019

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

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

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);
}

GlobalExceptionHandler:

@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));
     }

1 Ответ

0 голосов
/ 14 февраля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...