← Назад к вопросам

Что такое @RestController?

1.2 Junior🔥 161 комментариев
#REST API и микросервисы#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

@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;
    }
}

Как это работает

  1. Spring получает HTTP-запрос
  2. Маршрутизирует его в нужный метод контроллера
  3. Метод возвращает объект Java
  4. Spring автоматически сериализует объект в JSON (через Jackson или другую библиотеку)
  5. 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 приложениях.

Что такое @RestController? | PrepBro