Gymterview
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 везде, даже где достаточно простого возврата объекта.