Ответ
В 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.
Ключевые особенности:
- Имя переменной в аннотации должно совпадать с именем в пути (
{id}->@PathVariable Long id). - Если имена разные, укажите явно:
@PathVariable("id") Long userId. - Можно использовать разные типы:
String,Integer,Long,UUIDи т.д. Spring выполнит автоматическое преобразование. - Необязательный параметр (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), обычно используются для фильтрации, сортировки, необязательных данных.