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

时间:2011-08-26 21:03:41

标签: java tomcat jersey

我们目前正在使用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 /→本机图片战争目录

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

这很容易实现。只需在web.xml中注册Jersey ServletContainer作为过滤器(而不是servlet) - 请参阅this page的底部以获取示例 - 并使用ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEXServletContainer.FEATURE_FILTER_FORWARD_ON_404 init param来创建静态内容可访问。

答案 1 :(得分:0)

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

  1. 路径映射:/rest/*
  2. 扩展名映射:*.png
  3. 默认:/
  4. 路径映射+扩展映射:坏主意

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

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

    使用过滤器

    web.xml

    中设置UrlRewriteFilter
    <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    urlrewrite.xml配置文件中:

    <urlrewrite default-match-type="wildcard">
        <rule>
            <from>/rest/images/**</from>
            <to>/images/$1</to>
        </rule>
    </urlrewrite>
    

    未映射/ rest

    中的静态资源

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

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