我正在使用泽西编写基于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);
等等。
答案 0 :(得分: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
个文件(例如),您也可以更轻松地过滤文件名。
解决了这个问题后,你只需要为媒体服务。 :)
答案 1 :(得分:1)
JAX-RS Specification告诉我们有关URI模板的信息:
模板参数可以选择指定用于匹配其值的正则表达式。默认值与任何文本匹配,并在路径段的末尾终止
如果要匹配“路径段的末尾”,请使用正确的正则表达式。这个适合你:
@Path("{path:.*}/{filename}")