3

在 Tomcat 2.0.27 中通过 Jersey 1.19 创建 REST 服务时,@PathParams 中是否应该有空格?

每当我尝试使用文件名路径参数中的空格调用我的 REST-Service 时,Jersey 都会返回 400 Bad Request。它甚至没有到达我的代码。如果文件名中没有空格,则一切都按预期工作。我的 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:.+}")

我尝试通过添加以下内容来激活 Jersey 日志记录:

<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>

但找不到任何额外的输出。我什至对包含“log”或“out”的访问文件进行了procmon。

谷歌搜索“球衣休息空间@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 服务相似)。所以我真的很想听听你的意见。谢谢!

4

0 回答 0