Как в Spring MVC извлечь параметр id из пути URL?

«Как в Spring MVC извлечь параметр id из пути URL?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Spring MVC для извлечения переменной из пути URL используется аннотация @PathVariable.

Базовый пример:

@RestController
@RequestMapping("/api/users")
public class UserController {

    @GetMapping("/{id}") // Переменная пути указывается в фигурных скобках
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        // Spring автоматически преобразует значение из URL в тип Long
        User user = userService.findById(id);
        return ResponseEntity.ok(user);
    }
}

При запросе GET /api/users/123 в параметр id метода будет передано значение 123.

Ключевые особенности:

  1. Имя переменной в аннотации должно совпадать с именем в пути ({id} -> @PathVariable Long id).
  2. Если имена разные, укажите явно: @PathVariable("id") Long userId.
  3. Можно использовать разные типы: String, Integer, Long, UUID и т.д. Spring выполнит автоматическое преобразование.
  4. Необязательный параметр (Spring 4.3.3+):
    @GetMapping("/{id}")
    public ResponseEntity<?> getByIdOrAll(@PathVariable(required = false) Long id) {
        if (id != null) { /* вернуть по id */ }
        else { /* вернуть все */ }
    }

Извлечение нескольких параметров из пути:

@GetMapping("/posts/{postId}/comments/{commentId}")
public Comment getComment(@PathVariable Long postId,
                          @PathVariable String commentId) {
    // ...
}

Почему @PathVariable, а не @RequestParam?

  • @PathVariable — часть структуры пути (/resource/{id}), что соответствует RESTful-дизайну для идентификации конкретного ресурса.
  • @RequestParam — это параметры запроса, добавляемые после ? (/resource?id=123), обычно используются для фильтрации, сортировки, необязательных данных.