Контроллеры Spring MVC

Контроллер превращает HTTP-вход в вызов прикладного сценария и HTTP-ответ. Бизнес-правила и транзакции лучше оставлять сервисному слою.

@RestController
@RequestMapping("/orders")
class OrderController {
    private final OrderService service;
 
    OrderController(OrderService service) {
        this.service = service;
    }
 
    @GetMapping("/{id}")
    OrderResponse get(@PathVariable long id) {
        return service.get(id);
    }
 
    @PostMapping
    ResponseEntity<OrderResponse> create(
            @Valid @RequestBody CreateOrderRequest request) {
        OrderResponse result = service.create(request);
        return ResponseEntity
            .status(HttpStatus.CREATED)
            .body(result);
    }
}

Привязка аргументов

  • @PathVariable — часть пути, идентичность ресурса;
  • @RequestParam — фильтр, опция, пагинация;
  • @RequestHeader — HTTP-заголовок;
  • @RequestBody — десериализация тела через message converter;
  • Principal/authentication — текущий субъект после security filter chain.

Не следует принимать JPA entity прямо как API-контракт: это связывает внешний JSON с persistence-моделью и может открыть лишние поля.

Ошибки

@ControllerAdvice и @ExceptionHandler переводят доменные/прикладные ошибки в единый формат ответа. Не стоит возвращать stack trace и внутренний текст SQL клиенту.

СитуацияЧастый статус
неверный формат входа400
нет аутентификации401
нет права403
ресурс не найден404
конфликт версии/состояния409

Коды выбираются по контракту API, а не по Java-типу исключения.

Вопросы для повторения

  1. Чем @Controller отличается от @RestController? Первый обычно возвращает view, второй пишет значение в body.
  2. Где выполняется валидация тела? После десериализации при @Valid, до вызова метода при успешном binding.
  3. Почему entity не должна быть request DTO? Persistence-граф и внешний контракт меняются по разным причинам.
  4. Кто находит метод контроллера? HandlerMapping, а вызывает его подходящий HandlerAdapter.
  5. Где централизовать ошибки? В @ControllerAdvice, сохраняя стабильный формат.

Связано: Front Controller, REST, Фильтры Filters слушатели Listeners и перехватчики Interceptors.