Что такое @RestController?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
@RestController в Spring
@RestController — это аннотация в Spring Framework, которая объединяет функциональность @Controller и @ResponseBody. Она используется для создания REST API, то есть контроллеров, которые возвращают данные (обычно в JSON формате) вместо HTML-страниц.
Основное назначение
Эта аннотация позволяет определить класс, методы которого обрабатывают HTTP-запросы и возвращают ответы в виде объектов, которые автоматически сериализуются в JSON (или XML). Без @RestController пришлось бы использовать @Controller + @ResponseBody на каждом методе.
Пример использования
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/users")
public class UserController {
// GET /api/users - возвращает список всех пользователей
@GetMapping
public List<User> getAllUsers() {
return List.of(
new User(1, "Alice"),
new User(2, "Bob")
);
}
// GET /api/users/{id} - возвращает пользователя по id
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return new User(id, "User Name");
}
// POST /api/users - создаёт нового пользователя
@PostMapping
public User createUser(@RequestBody User user) {
return user; // в реальности сохранили бы в БД
}
// PUT /api/users/{id} - обновляет пользователя
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {
return user;
}
// DELETE /api/users/{id} - удаляет пользователя
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
// удаляем из БД
}
}
class User {
Long id;
String name;
public User(Long id, String name) {
this.id = id;
this.name = name;
}
}
Как это работает
- Spring получает HTTP-запрос
- Маршрутизирует его в нужный метод контроллера
- Метод возвращает объект Java
- Spring автоматически сериализует объект в JSON (через Jackson или другую библиотеку)
- JSON отправляется клиенту с заголовком Content-Type: application/json
Отличие от @Controller
// @Controller требует @ResponseBody на каждом методе
@Controller
public class MyController {
@GetMapping
@ResponseBody // нужна явно!
public User getUser() {
return new User();
}
}
// @RestController уже содержит @ResponseBody
@RestController
public class MyRestController {
@GetMapping
public User getUser() { // @ResponseBody подразумевается!
return new User();
}
}
Аннотации для методов
Внутри @RestController используются аннотации для маршрутизации:
@GetMapping— GET запрос (получение данных)@PostMapping— POST запрос (создание)@PutMapping— PUT запрос (полное обновление)@PatchMapping— PATCH запрос (частичное обновление)@DeleteMapping— DELETE запрос (удаление)
Все они — сокращение @RequestMapping(method = RequestMethod.GET) и т.д.
Параметры из запроса
@RestController
@RequestMapping("/api/products")
public class ProductController {
// @PathVariable - из пути: /api/products/123
@GetMapping("/{id}")
public Product getProduct(@PathVariable Long id) { ... }
// @RequestParam - из query string: ?name=Laptop&price=1000
@GetMapping("/search")
public List<Product> search(@RequestParam String name, @RequestParam Double price) { ... }
// @RequestBody - из тела запроса (JSON)
@PostMapping
public Product create(@RequestBody Product product) { ... }
}
HTTP коды ответов
По умолчанию методы GET возвращают 200 OK, POST — 200 OK. Но можно управлять кодом:
@PostMapping
@ResponseStatus(HttpStatus.CREATED) // 201 вместо 200
public User createUser(@RequestBody User user) {
return user;
}
Это стандартный и удобный способ строить REST API в Spring приложениях.