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

Дополнительные переменные пути Spring

Узнайте, как сделать переменную path необязательной в разных версиях Spring.

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

1. Обзор

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

Для получения краткого обзора переменных пути, пожалуйста, прочтите нашу статью Spring MVC .

2. Как Spring Связывает Параметры @PathVariable

По умолчанию Spring попытается связать все параметры, аннотированные с помощью @PathVariable в методе обработчика, с соответствующими переменными в шаблоне URI. Если Spring потерпит неудачу, он не доставит наш запрос этому методу обработчика.

Например, рассмотрим следующий метод getArticle , который пытается (безуспешно) сделать переменную id path необязательной:

@RequestMapping(value = {"/article", "/article/{id}"})
public Article getArticle(@PathVariable(name = "id") Integer articleId) {
    if (articleId != null) {
        //...
    } else {
        //...
    }
}

Здесь метод getArticle должен обслуживать запросы как к /статье , так и к /статье/{id} . Spring попытается привязать параметр articleId к переменной id path, если она присутствует.

Например, при отправке запроса в /article/123 значение article Id устанавливается равным 123.

С другой стороны, если мы отправим запрос на /article , Spring вернет код состояния 500 из-за следующего исключения:

org.springframework.web.bind.MissingPathVariableException:
  Missing URI template variable 'id' for method parameter of type Integer

Это произошло потому, что Spring не смог установить значение для параметра article Id , поскольку id отсутствовал.

Итак, нам нужен какой-то способ сказать Spring игнорировать привязку определенного параметра @PathVariable , если у него нет соответствующей переменной пути, как мы увидим в следующих разделах.

3. Сделать Переменные Пути Необязательными

3.1. Использование обязательного атрибута @PathVariable

Начиная с весны 4.3.3, аннотация @PathVariable определяет логический атрибут required для нас, чтобы указать, является ли переменная пути обязательной для метода обработчика.

Например, в следующей версии get Article используется атрибут required :

@RequestMapping(value = {"/article", "/article/{id}"})
public Article getArticle(@PathVariable(required = false) Integer articleId) {
   if (articleId != null) {
       //...
   } else {
       //...
   }
}

Поскольку атрибут required имеет значение false , Spring не будет жаловаться, если переменная id path не будет отправлена в запросе. То есть Spring установит article Id в id , если он отправлен, или null в противном случае.

С другой стороны, если required был true , Spring выдаст исключение в случае отсутствия id .

3.2. Использование необязательного типа параметра

Следующая реализация показывает, как Spring 4.1 , наряду с необязательным классом JDK 8 , предлагает другой способ сделать articleId необязательным:

@RequestMapping(value = {"/article", "/article/{id}"}")
public Article getArticle(@PathVariable Optional optionalArticleId) {
    if (optionalArticleId.isPresent()) {
        Integer articleId = optionalArticleId.get();
        //...
    } else {
        //...
    }
}

Здесь Spring создает экземпляр Optional , optional articleId , чтобы сохранить значение id . Если id присутствует, необязательный идентификатор статьи обернет его значение, в противном случае необязательный идентификатор статьи обернет значение null . Затем мы можем использовать Необязательные ‘s is Present (), get (), или или еще() методы для работы со значением.

3.3. Использование типа параметра карты

Другой способ определить необязательную переменную пути, доступную с весны 3.2, – это использовать M ap для @ Переменной пути параметров:

@RequestMapping(value = {"/article", "/article/{id}"})
public Article getArticle(@PathVariable Map pathVarsMap) {
    String articleId = pathVarsMap.get("id");
    if (articleId != null) {
        Integer articleIdAsInt = Integer.valueOf(articleId);
        //...
    } else {
        //...
    }
}

В этом примере параметр Map String> path Vars Map собирает все переменные пути, которые находятся в URL-адресе, в виде пар ключ/значение. Затем мы можем получить конкретную переменную пути, используя метод get () . String>

Обратите внимание , что поскольку Spring извлекает значение переменной path в виде String , мы использовали метод Integer.valueOf() для преобразования его в Integer .

3.4. Использование Двух Методов Обработки

В случае, если мы использовали устаревшую версию Spring, мы можем разделить метод обработчика getArticle на два метода.

Первый метод будет обрабатывать запросы на /article/{id} :

@RequestMapping(value = "/article/{id}")
public Article getArticle(@PathVariable(name = "id") Integer articleId) {
    //...        
}

В то время как второй метод будет обрабатывать запросы на /статью :

@RequestMapping(value = "/article")
public Article getDefaultArticle() {
    //...
}

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

Подводя итог, мы обсудили, как сделать переменную path необязательной в разных версиях Spring.

Как обычно, полный код этой статьи доступен на GitHub .