4

我正在使用 jersey 编写基于 Java 的 REST Web 服务。我正在为其编写 Web 服务的实体是一个媒体文件。请求媒体文件的客户端需要将路径和文件名作为路径参数发送。允许的媒体路径深度可达五个目录。现在的挑战是编写一个方法来处理所有路径深度的可能性。就业务场景而言,使用路径参数是唯一允许的选择。这是处理媒体文件请求的方法契约:

public Response getMediaFile(@PathParam("path") String path,
                        @PathParam("filename") String filename);

这种方法的问题在于,如果请求类似于 /media/filedir1/filedir2/filename 那么文件名将无法正确获取。

我实施的解决方案是,我重载了这个方法来处理所有目录深度,但我并不相信这是最好的解决方案:

public Response getMediaFile(@PathParam("path1") String path1, 
                        @PathParam("path2") String path2, 
                        @PathParam("filename") String filename);

public Response getMediaFile(@PathParam("path1") String path1, 
                                @PathParam("path2") String path2, 
                                @PathParam("path3") String path3,
                                @PathParam("filename") String filename);

等等。

4

2 回答 2

2

您应该能够在@PathParam注释中使用正则表达式来处理所有路径过滤逻辑。例如,这将为您提供一个最多包含 5 个目录的文件路径:

@Path("{path:(?:[^/]+/){0,4}[^/]+}")

然后,您将按预期将该值注入方法中:

@Path("{path:(?:[^/]+/){0,4}[^/]+}")
/* Other attributes too... */
public Response getMediaFile(@PathParam("path") String path) {
    File file=new File(MEDIA_HOME_DIR, path);
    if(file.exists()) {
        // Process file
    }
    else {
        // No such file
    }
}

正则表达式将处理“五个目录”的限制,如果将来这个数字从五个改变,它会很容易修复。如果您只需要匹配.jpg文件(例如),您也可以更仔细地过滤文件名。

解决了这个问题,您只需要为媒体服务。:)

于 2013-06-10T02:15:44.977 回答
1

JAX-RS 规范告诉我们有关 URI 模板的信息:

模板参数可以选择指定用于匹配其值的正则表达式。默认值匹配任何文本并在路径段的末尾终止

如果要匹配“路径段的结尾”,请使用正确的正则表达式。这个适合你:

@Path("{path:.*}/{filename}")
于 2013-06-03T09:51:11.743 回答