Для чего используется ResponseEntity в Spring MVC?

«Для чего используется ResponseEntity в Spring MVC?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ResponseEntity — это обертка в Spring MVC для полного контроля над HTTP-ответом, включая статус-код, заголовки и тело.

Зачем это нужно? Позволяет гибко формировать ответы REST-контроллера, выходя за рамки простого возврата тела, как при использовании @ResponseBody.

Основные возможности:

  • Установка HTTP-статуса (200 OK, 404 NOT_FOUND, 201 CREATED и т.д.).
  • Добавление произвольных HTTP-заголовков.
  • Возврат ответа без тела (например, 204 No Content).

Практические примеры:

@RestController
@RequestMapping("/api/books")
public class BookController {

    // 1. Успешный ответ с телом и статусом 200
    @GetMapping("/{id}")
    public ResponseEntity<Book> getBook(@PathVariable Long id) {
        Book book = bookService.findById(id);
        return ResponseEntity.ok(book); // Статус 200 OK
    }

    // 2. Ответ с кастомным статусом и заголовками
    @PostMapping
    public ResponseEntity<Book> createBook(@RequestBody Book book, UriComponentsBuilder ucb) {
        Book savedBook = bookService.save(book);
        URI location = ucb.path("/api/books/{id}").buildAndExpand(savedBook.getId()).toUri();
        return ResponseEntity.created(location).body(savedBook); // Статус 201 CREATED + заголовок Location
    }

    // 3. Ответ об ошибке (ресурс не найден)
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteBook(@PathVariable Long id) {
        if (!bookService.existsById(id)) {
            return ResponseEntity.notFound().build(); // Статус 404 NOT_FOUND
        }
        bookService.deleteById(id);
        return ResponseEntity.noContent().build(); // Статус 204 NO_CONTENT
    }
}

Альтернативы:

  • @ResponseBody + аннотации для статуса (@ResponseStatus) — менее гибко.
  • Возврат объекта напрямую — всегда статус 200 OK.

Вывод: ResponseEntity — это стандартный инструмент для построения полноценных, семантически корректных REST-ответов в Spring.