Контроллеры 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-типу исключения.
Вопросы для повторения
- Чем
@Controllerотличается от@RestController? Первый обычно возвращает view, второй пишет значение в body. - Где выполняется валидация тела? После десериализации при
@Valid, до вызова метода при успешном binding. - Почему entity не должна быть request DTO? Persistence-граф и внешний контракт меняются по разным причинам.
- Кто находит метод контроллера?
HandlerMapping, а вызывает его подходящийHandlerAdapter. - Где централизовать ошибки? В
@ControllerAdvice, сохраняя стабильный формат.
Связано: Front Controller, REST, Фильтры Filters слушатели Listeners и перехватчики Interceptors.