tgoop.com/Java_Iibrary/1828
Last Update:
В Spring Boot ProductController нужно обработать два разных случая:
1. Вернуть простой 404 Not Found, если продукт не найден.
2. Вернуть 201 Created с динамическим заголовком Location при успешном создании.
Какие механизмы Spring вы бы использовали для реализации каждого из этих требований и почему?
Два основных способа управлять HTTP-ответом, отправляемым клиенту:
→ @ResponseStatus
: простой статический вариант
- Можно навесить на исключение или метод контроллера.
- Всегда возвращает один и тот же HTTP-статус.
- Подход "fire-and-forget": быстро и лаконично в случаях, когда ответ всегда одинаковый.
- Лучше всего подходит для простой обработки ошибок. Например, ResourceNotFoundException, аннотированный @ResponseStatus(HttpStatus.NOT_FOUND)
, всегда будет возвращать 404.
- Нельзя добавить кастомные заголовки или динамическое тело ответа.
→ ResponseEntity
: кастомный инструмент
- Даёт полный программный контроль над формированием HTTP-ответа во время выполнения.
- Можно выставить статус, добавить заголовки и собрать тело ответа так, как требуется по логике.
- Лучше всего подходит для сложных ответов. Например, когда нужно добавить заголовок Location после создания ресурса (201 Created) или вернуть детализированный JSON-объект с информацией об ошибке.
- Это основной инструмент, когда ответ должен зависеть от ситуации.
Комбинация подходов:
Используя @RestControllerAdvice
для глобальной обработки исключений, можно применять @ResponseStatus
для типовых ошибок, а ResponseEntity — для более специфичных и динамичных ответов. Такой подход даёт одновременно и эффективность, и гибкость.