@PathVariable, @RequestParam
Тема дорожной карты · Spring Boot
Path Variables и параметры запроса — два основных механизма в Spring Boot для извлечения динамических данных из входящих HTTP-запросов в методе @RestController или @Controller. @PathVariable привязывает сегмент URI-шаблона — например, /users/{id} — непосредственно к параметру метода, при этом Spring Boot выполняет автоматическое преобразование типов, так что @PathVariable Long id получает распарсенный Long без дополнительного кода. @RequestParam привязывает параметры строки запроса, такие как ?page=2&size=20, поддерживает значения по умолчанию через атрибут defaultValue и может быть помечен required = false для необязательной фильтрации, что делает его стандартным выбором для эндпоинтов пагинации и поиска. Обе аннотации прозрачно работают с сокращениями @RequestMapping, @GetMapping и @PostMapping уровня методов Spring MVC и участвуют в конвейере привязки данных и Bean Validation Spring, так что ограничения @Validated, например @Min(1) на path variables, применяются автоматически. Понимание Path Variables и параметров запроса является основой для проектирования RESTful API с Spring Boot, поскольку они напрямую формируют URL-контракт, от которого зависят клиенты, API-шлюзы и правила Kubernetes Ingress.
Как это работает
@PathVariable, @RequestParam: Spring MVC + REST. @RestController возвращает JSON (или что HttpMessageConverter выберет); @RequestMapping (или method-specific @GetMapping/@PostMapping) маппит URL → handler. @PathVariable для /users/{id}, @RequestParam для query string, @RequestBody для десериализации body. @Valid + Bean Validation (Jakarta Validation) проверяет input. @ControllerAdvice + @ExceptionHandler централизуют error → HTTP-response маппинг. Servlet-стек на Tomcat дефолт; переключайтесь на Jetty/Undertow через starter exclusions.
Когда применять
DTO на границе controller — никогда не экспортируйте JPA-сущности напрямую (утечка внутренней модели + lazy-loading issues). Централизуйте error handling в @ControllerAdvice — дублированный try/catch = технический долг. Валидация рано. OpenAPI (springdoc-openapi) для документации + генерации клиентов. Для high-throughput non-blocking — WebFlux, но только при реальной нужде.
Типичные ошибки
Ловушки @PathVariable, @RequestParam: возврат JPA-сущностей (lazy-loading бьёт DB после закрытия транзакции → LazyInitializationException); нет валидации input (мусор лезет в service-слой); не используют @ControllerAdvice (error handling разбросан, неконсистентные ответы); игнор HTTP-семантики (200 на ошибках).