Ответ
ResponseEntity
Зачем это нужно?
Позволяет гибко формировать ответы 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.