Итак, вот моя текущая реализация конечной точки 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));
}
@Cocuthemyth обновил мой пост!
Вы можете использовать @ControllerAdvice с @ExceptionHandler для реализации глобальной обработки исключений для всех контроллеров и для определенного типа исключений.
Посмотрите здесь для примеров.
У меня есть ответ: stackoverflow.com/questions/53762829/…, надеюсь, это поможет