Tomcat Jersey REST - Пространства в @PathParam

Должны ли быть пробелы в @PathParams при создании REST-сервисов через Jersey 1.19 в Tomcat 2.0.27?

Джерси возвращает 400 Bad Request каждый раз, когда я пытаюсь вызвать REST-Service с пробелом в параметре пути к имени файла. Это даже не достигает моего кода. Если в имени файла нет пробела, все работает как положено. Аннотации моего метода REST следующие:

@GET
@Path("/trennblatt/{objId}/{filename}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getTrennblatt(
@PathParam("objId") final long objId,
@PathParam("filename") final String filename,
@Context final HttpServletResponse response)

В журнале доступа Tomcat кодировка выглядит нормально:

[18/Apr/2016:11:09:17 +0200] "GET /.../trennblatt/228342/01%20Aktendecke.pdf HTTP/1.1" 400 1004
[18/Apr/2016:11:09:29 +0200] "GET /.../trennblatt/228342/inspectionsheet.html HTTP/1.1" 200 44870
[18/Apr/2016:11:13:29 +0200] "GET /.../trennblatt/228342/inspectionsheet.html/ HTTP/1.1" 200 44870
[18/Apr/2016:11:13:33 +0200] "GET /.../trennblatt/228342/01%20Aktendecke.pdf/ HTTP/1.1" 400 1004

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

@Path("/trennblatt/{objId}/{filename}/")

Я также попытался указать набор символов для имени файла (все):

@Path("/trennblatt/{objId}/{filename:.+}")

Я попытался активировать регистрацию на Джерси, добавив:

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>

но не смог найти никакого дополнительного выхода. Я даже procmon'd для доступа к файлам, содержащим "log" или "out".

Поиск в Google для таких вещей, как "места отдыха Джерси @PathParam", всегда возвращает такие забавные вещи, как "Как включить косые черты и точки в @PathParam". Я вижу, как это будет проблемой. Но я не смог найти четкого утверждения о том, должны ли работать простые (и правильно закодированные) пробелы в @PathParam.

Когда я использую @QueryParam все в порядке.

@GET
@Path("/trennblatt")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getTrennblatt(
@QueryParam("objId") final long objId,
@QueryParam("filename") final String filename,
@Context final HttpServletResponse response)

[18/Apr/2016:11:17:47 +0200] "GET /.../trennblatt?objId=228342&filename=inspectionsheet.html HTTP/1.1" 200 44870
[18/Apr/2016:11:18:04 +0200] "GET /.../trennblatt?objId=228342&filename=01%20Aktendecke.pdf HTTP/1.1" 200 45081

Это мой текущий обходной путь, но есть смысл использовать @PathParam (сохраняя его максимально похожим на наш сервис WebDAV). Поэтому я бы очень хотел получить ваш вклад по этому вопросу. Спасибо!

0 ответов

Другие вопросы по тегам