Итак, вот моя текущая реализация конечной точки 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));
}