Подтвердить что ты не робот

Необязательный @PathParam в Jax-RS

У меня есть служба, где последняя часть пути является необязательной, пользователь может ввести /mypath/ и /mypath/param1/.

Я попытался использовать регулярное выражение для фильтрации последней части пути:

@Path("/mypath{param1: (/param1)?}")

Я использую RestEasy как поставщик JAX-RS, и код работает так, как ожидалось, в Tomcat, но когда я его развертываю в JBoss, я получаю код возврата 405, когда я не отправляю необязательную часть.

Я делаю что-то не так, или это невозможно сделать переносимым образом?

4b9b3361

Ответ 1

Проблема заключалась в отсутствии пробелов перед двоеточием:

@Path("/mypath{param1: (/param1)?}")

должен быть:

@Path("/mypath{param1 : (/param1)?}")

По-видимому, это ошибка, потому что спецификация делает пробелы вокруг двоеточия необязательными. Я также обнаружил, что я не первый укушенный этой ошибкой.

Ответ 2

В моем случае мне пришлось использовать это другое выражение:

@Path('/mypath/{param1 : (\\w+)?}')

В противном случае вы должны очистить параметр.

Ответ 3

Проверьте, существует ли путь, уже определенный с помощью /mypath, который принимает другой метод, это может быть причиной того, что вы возвращаете 405 (метод не разрешен). Также, когда у вас есть дополнительные параметры, я думаю, что лучше сделать им параметры запроса.

Ответ 4

С Dropwizard 1.0 и Java8 вы можете использовать опцию

@Path("/news")
getLastNews(@QueryParam("topicId") String topicId, @QueryParam("limit") Optional<Integer> limit) 

Он даст ответ на оба

/news?topicId=123213?limit=200

и

/news?topicId=123213