Необязательный @PathParam в Jax-RS
У меня есть служба, где последняя часть пути является необязательной, пользователь может ввести /mypath/ и /mypath/param1/.
Я попытался использовать регулярное выражение для фильтрации последней части пути:
@Path("/mypath{param1: (/param1)?}")
Я использую RestEasy как поставщик JAX-RS, и код работает так, как ожидалось, в Tomcat, но когда я его развертываю в JBoss, я получаю код возврата 405, когда я не отправляю необязательную часть.
Я делаю что-то не так, или это невозможно сделать переносимым образом?
Ответы
Ответ 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