Пролет @Pathvariable Анотация

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.