1. Обзор
В этом кратком руководстве мы рассмотрим аннотацию Spring @PathVariable .
Проще говоря, аннотацию @PathVariable можно использовать для обработки переменных шаблона в отображении URI запроса и использовать их в качестве параметров метода.
Давайте посмотрим, как использовать @PathVariable и его различные атрибуты.
2. Простое Сопоставление
Простым вариантом использования аннотации @PathVariable будет конечная точка, которая идентифицирует объект с первичным ключом:
@GetMapping("/api/employees/{id}") @ResponseBody public String getEmployeesById(@PathVariable String id) { return "ID: " + id; }
В этом примере мы используем аннотацию @PathVariable для извлечения шаблонной части URI, представленной переменной {id} .
Простой запрос GET to /api/employees | {id} вызовет |/getEmployeesById с извлеченным значением идентификатора:
http://localhost:8080/api/employees/111 ---- ID: 111
Теперь давайте подробнее рассмотрим эту аннотацию и рассмотрим ее атрибуты.
3. Указание имени переменной Path
В предыдущем примере мы пропустили определение имени переменной пути шаблона, так как имена параметра метода и переменной пути были одинаковыми.
Однако, если имя переменной path отличается, мы можем указать его в аргументе аннотации @PathVariable :
@GetMapping("/api/employeeswithvariable/{id}") @ResponseBody public String getEmployeesByIdWithVariableName(@PathVariable("id") String employeeId) { return "ID: " + employeeId; }
http://localhost:8080/api/employeeswithvariable/1 ---- ID: 1
Мы также можем определить имя переменной path как @PathVariable(value=”id”) вместо PathVariable(“id”) для ясности.
4. Несколько переменных пути в одном запросе
В зависимости от варианта использования, мы можем иметь более одной переменной пути в нашем URI запроса для метода контроллера, который также имеет несколько параметров метода :
@GetMapping("/api/employees/{id}/{name}") @ResponseBody public String getEmployeesByIdAndName(@PathVariable String id, @PathVariable String name) { return "ID: " + id + ", name: " + name; }
http://localhost:8080/api/employees/1/bar ---- ID: 1, name: bar
Мы также можем справиться с несколькими @PathVariable параметры с использованием параметра метода типа java.util.Map<Строка, Строка>:
@GetMapping("/api/employeeswithmapvariable/{id}/{name}") @ResponseBody public String getEmployeesByIdAndNameWithMapVariable(@PathVariable MappathVarsMap) { String id = pathVarsMap.get("id"); String name = pathVarsMap.get("name"); if (id != null && name != null) { return "ID: " + id + ", name: " + name; } else { return "Missing Parameters"; } }
http://localhost:8080/api/employees/1/bar ---- ID: 1, name: bar
Однако существует небольшая проблема при обработке нескольких параметров @ Path Variable , когда строка переменной path содержит символ точки (.). Мы подробно обсудили эти угловые случаи здесь .
5. Необязательные Переменные Пути
Весной параметры метода, аннотированные @PathVariable обязательны по умолчанию:
@GetMapping(value = { "/api/employeeswithrequired", "/api/employeeswithrequired/{id}" }) @ResponseBody public String getEmployeesByIdWithRequired(@PathVariable String id) { return "ID: " + id; }
Судя по тому, как это выглядит, вышеупомянутый контроллер должен обрабатывать как /api/сотрудников с требуемыми , так и /api/сотрудников с требуемыми/1 путями запроса. Но, поскольку параметры метода, аннотированные @PathVariables , по умолчанию являются обязательными, он не обрабатывает запросы, отправленные в /api/employeeswithrequired path:
http://localhost:8080/api/employeeswithrequired ---- {"timestamp":"2020-07-08T02:20:07.349+00:00","status":404,"error":"Not Found","message":"","path":"/api/employeeswithrequired"} http://localhost:8080/api/employeeswithrequired/1 ---- ID: 111
Мы можем справиться с этим двумя способами.
5.1. Установка @PathVariable как Не требуется
Мы можем установить required свойство @PathVariable в false , чтобы сделать его необязательным. Следовательно, изменив наш предыдущий пример, мы теперь можем обрабатывать версии URI с переменной path и без нее:
@GetMapping(value = { "/api/employeeswithrequiredfalse", "/api/employeeswithrequiredfalse/{id}" }) @ResponseBody public String getEmployeesByIdWithRequiredFalse(@PathVariable(required = false) String id) { if (id != null) { return "ID: " + id; } else { return "ID missing"; } }
http://localhost:8080/api/employeeswithrequiredfalse ---- ID missing
5.2. Использование java.util.Необязательный
Начиная с весны 4.1, мы также можем использовать java.util.Необязательный (доступен в Java 8+) для обработки необязательной переменной пути:
@GetMapping(value = { "/api/employeeswithoptional", "/api/employeeswithoptional/{id}" }) @ResponseBody public String getEmployeesByIdWithOptional(@PathVariable Optionalid) { if (id.isPresent()) { return "ID: " + id.get(); } else { return "ID missing"; } }
Теперь, если мы не указываем переменную пути id в запросе, мы получаем ответ по умолчанию:
http://localhost:8080/api/employeeswithoptional ---- ID missing
5.3. Использование параметра метода типа Map String> String>
Как было показано ранее, мы можем использовать один параметр метода типа java.util.Map для обработки всех переменных пути в URI запроса. Мы также можем использовать эту стратегию для обработки необязательных переменных пути.:
@GetMapping(value = { "/api/employeeswithmap/{id}", "/api/employeeswithmap" }) @ResponseBody public String getEmployeesByIdWithMap(@PathVariable MappathVarsMap) { String id = pathVarsMap.get("id"); if (id != null) { return "ID: " + id; } else { return "ID missing"; } }
6. Значение по умолчанию для @PathVariable
Из коробки нет положения для определения значения по умолчанию для параметров метода с аннотацией @PathVariable . Тем не менее, мы можем использовать те же стратегии, которые обсуждались выше, чтобы удовлетворить случай значений по умолчанию для @PathVariable . Нам просто нужно проверить наличие null в переменной path.
Например, с помощью java.util.Необязательный String> , мы можем определить, является ли переменная пути null или нет. Если это null , то мы можем просто ответить на запрос значением по умолчанию: String>
@GetMapping(value = { "/api/defaultemployeeswithoptional", "/api/defaultemployeeswithoptional/{id}" }) @ResponseBody public String getDefaultEmployeesByIdWithOptional(@PathVariable Optionalid) { if (id.isPresent()) { return "ID: " + id.get(); } else { return "ID: Default Employee"; } }
7. Заключение
В этой статье мы обсудили, как использовать аннотацию Spring @PathVariable . Мы также определили различные способы эффективного использования аннотации @PathVariable для различных вариантов использования, таких как необязательные параметры и работа со значениями по умолчанию.
Пример кода, показанный в этой статье, также доступен на Github .