如何将服务器端Jax-rs调用与没有前缀的本机文件混合使用?

我们目前正在使用Jersey JAX-RS实现来处理我们的REST请求(服务器端Jersey)。 我们的web.xml文件已配置好所有/ rest / *请求由Jersey处理。 没关系。 我们的服务器目前是Tomcat6,并使用Java6(在Ubuntu 11.04上)

所以,:// myserver / rest / customer /是好的,Jersey用@Path(“/ customer”)前缀调用该类。

现在我们也有静态内容,例如:// myserver / images / … wich加载很好。

有没有办法这样做,我们可以摆脱/ rest / *前缀并将它们混合在一起?

我们想要实现的目标:: // myserver / rest / customer /→Jersey:// myserver / rest / images /→本机图像战争目录

谢谢你的帮助

这很容易实现。 只需在web.xml中注册Jersey ServletContainer作为filter(而不是servlet) – 请参阅本页底部的示例 – 并使用ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX或ServletContainer.FEATURE_FILTER_FORWARD_ON_404 init参数来使静态内容可访问。

首先,当谈到servlet映射时,优先级如下:

  1. 路径映射: /rest/*
  2. 扩展映射: *.png
  3. 默认值: /

路径映射+扩展映射:坏主意

因此,您无法通过现有路径映射中的文件扩展名映射静态资源(无论如何,管理web.xml中的所有静态文件扩展名都是个坏主意)。

路径映射的优先级> ext映射。

使用filter

web.xml设置UrlRewriteFilter

  UrlRewriteFilter org.tuckey.web.filters.urlrewrite.UrlRewriteFilter   UrlRewriteFilter /*  

在您的urlrewrite.xml配置文件中:

   /rest/images/** /images/$1   

不在/ rest中映射静态资源

这可能不适合您的需求,但这是我的最爱! 在/rest映射静态资源说“嘿,开发人员,来GET / POST / PUT / DELETE来获取静态资源,没关系”

  • 如果你不能GET / PUT / POST / DELETE这些资源,那么你不应该将它们映射到/rest 。 它给人的印象是错误的。
  • 如果你真的想通过REST网络服务来操纵这些资源,那么让泽西做重点并提供这些资源(查看jersey-samples的例子)。