Рубрики
Без рубрики

Аннотация Spring @PathVariable

Когда нам нужно извлечь значения из URI запроса, @PathVariable-это путь. Давайте посмотрим, как его использовать.

Автор оригинала: baeldung.

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 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";
    }
}
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 Optional id) {
    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 Map pathVarsMap) {
    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 Optional id) {
    if (id.isPresent()) {
        return "ID: " + id.get();
    } else {
        return "ID: Default Employee";
    }
}

7. Заключение

В этой статье мы обсудили, как использовать аннотацию Spring @PathVariable . Мы также определили различные способы эффективного использования аннотации @PathVariable для различных вариантов использования, таких как необязательные параметры и работа со значениями по умолчанию.

Пример кода, показанный в этой статье, также доступен на Github .