junior
Что такое ResponseEntity и зачем он нужен?
ResponseEntity — класс Spring, представляющий полный HTTP-ответ: тело, заголовки и код статуса. Позволяет гибко управлять всеми аспектами ответа контроллера.
Зачем нужен
- Управление HTTP-кодом ответа.
- Добавление пользовательских заголовков.
- Контроль тела ответа.
- Возврат ответа без тела (204 No Content).
- Указание URI созданного ресурса (201 Created + Location).
Примеры использования
Пример
// 200 OK с телом
return ResponseEntity.ok(user);
// 201 Created с Location
URI location = URI.create("/api/users/" + user.getId());
return ResponseEntity.created(location).body(user);
// 204 No Content
return ResponseEntity.noContent().build();
// 404 Not Found
return ResponseEntity.notFound().build();
// С кэшированием
return ResponseEntity.ok()
.cacheControl(CacheControl.maxAge(Duration.ofHours(1)))
.eTag("v1")
.body(user);
Сравнение подходов
| Подход | Когда использовать |
|---|---|
Без ResponseEntity (return user) |
Простые случаи, всегда 200 OK, нет контроля над заголовками |
| С ResponseEntity | Когда нужен контроль статуса, заголовков или условный ответ |
Пример
// Без ResponseEntity — всегда 200 OK
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
// С ResponseEntity — полный контроль
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return userService.findById(id)
.map(user -> ResponseEntity.ok()
.eTag(String.valueOf(user.getVersion()))
.body(user))
.orElse(ResponseEntity.notFound().build());
}
На собеседовании: объясните, что ResponseEntity даёт контроль над статусом, заголовками и телом ответа. Частая ошибка — использовать ResponseEntity везде, даже где достаточно простого возврата объекта.