Статьи

Java EE 8 MVC: работа с параметрами пути

В предыдущем посте мы увидели, как работать с параметрами запроса в Java EE MVC . Этот пост продолжается с очень похожей темой: параметры пути.

Параметры пути являются динамической частью пути запроса и могут быть указаны с помощью аннотации @Path.

Например:

01
02
03
04
05
06
07
08
09
10
@Controller
@Path("path-params")
public class PathParamsController {
 
  @GET
  @Path("/date/{year}/{month}")
  public String pathParamDate(@PathParam("year") int year, @PathParam("month") int month) {
    ...
  }
}

Параметр Paths заключен в фигурные скобки внутри аннотации @Path. В этом примере определены два параметра пути: год и месяц.

С помощью @PathParam параметры пути могут быть сопоставлены с параметрами метода.

Мы можем вызвать этот метод, отправив запрос

1
/path-params/date/2016/01

В этом случае 2016 и 1 будут передаваться как аргументы года и месяца.

Тип преобразования

Параметры пути используют те же правила преобразования типов, что и параметры запроса ( объяснение в предыдущем сообщении в блоге ).

Например, мы можем преобразовать параметр пути в значение перечисления следующим образом:

1
2
3
public enum Role {
  admin, reporter, accountant
}
01
02
03
04
05
06
07
08
09
10
@Controller
@Path("path-params")
public class PathParamsController {
 
  @GET
  @Path("/roles/{role}")
  public String pathParamUsers(@PathParam("role") Role role) {
    ...
  }
}

Если мы сейчас отправим запрос

1
/path-params/roles/admin

строка admin преобразуется в соответствующую константу перечисления.

Использование @PathParam для полей и методов

Как и @QueryParam, использование @PathParam не ограничивается параметрами метода. Также можно аннотировать поля или сеттеры с помощью @PathParam.

Например:

01
02
03
04
05
06
07
08
09
10
11
12
13
@Controller
@Path("path-params")
public class PathParamsController {
 
  @PathParam("category")
  private String category;
 
  @GET
  @Path("/categories/{category}")
  public String findByCategory() {
    // work with category
  }
}

Использование параметров пути с шаблонами

Можно определить более конкретный шаблон для переменной пути. Следовательно, регулярное выражение может быть добавлено после имени переменной пути.

Например:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
@Controller
@Path("path-params")
public class PathParamsController {
 
  @GET
  @Path("/users/{id : \\d+}")
  public String findUserById(@PathParam("id") long id) {
    ...
  }
 
  @GET
  @Path("/users/{name : [a-zA-Z]+}")
  public String findUserByName(@PathParam("name") String name) {
    ...
  
}

Здесь мы определяем два метода контроллера, которые прослушивают / users / {variable}:

  • findUserById () вызывается, только если числовой идентификатор является частью пути запроса
  • findUserByName () используется, если параметр пути соответствует регулярному выражению [a-zA-Z] +.

Так что, если мы отправим запрос

1
/path-params/users/123

Вызов findUserById () и 123 передается как идентификатор.

Отправка запроса на

1
/path-params/users/john

вызывает findUserByName () и передает john как имя.

Краткое резюме

@PathParam может использоваться для извлечения параметров пути, определенных с помощью @Path. Как и @QueryParam, @PathParam можно использовать для аргументов методов, полей экземпляров и методов.

При определении параметров пути с помощью @Path можно использовать регулярное выражение для определения конкретного шаблона пути.

  • Вы можете найти исходный код для всех показанных примеров на GitHub .