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