2012-09-14 85 views
19

如果我将Jersey的url模式映射到2.0版本中的/ *,它会为所有静态资源(例如/index.html)导致404。我的web.xml有:Jersey/* Servlet映射导致静态资源404错误

<servlet> 
    <servlet-name>JerseyApp</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
    <param-name>javax.ws.rs.Application</param-name> 
    <param-value>org.frog.jump.JerseyApp</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>JerseyApp</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

如何以相同的url模式提​​供静态内容?

回答

24

使用Jersey 1.x,如果从Jersey servlet切换到过滤器,您应该能够从相同路径提供静态内容。删除您指定的servlet的XML和切换到:

<filter> 
    <filter-name>Jersey Filter</filter-name> 
    <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class> 
    <init-param> 
    <param-name>javax.ws.rs.Application</param-name> 
    <param-value>org.frog.jump.JerseyApp</param-value> 
    </init-param> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name> 
    <param-value>/.*html</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>Jersey Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

编辑:在新泽西2.x的,你应该能够做同样的事情,但属性的名称已被更改。尝试是这样的:

<filter> 
    <filter-name>Jersey Filter</filter-name> 
    <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class> 
    <init-param> 
    <param-name>jersey.config.server.provider.packages</param-name> 
    <param-value>org.example</param-value> 
    </init-param> 
    <init-param> 
    <param-name>jersey.config.servlet.filter.staticContentRegex</param-name> 
    <param-value>/.*html</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>Jersey Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

而且你的POM应包括:

<dependency> 
    <groupId>org.glassfish.jersey.core</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>2.0-m07-1</version> 
    <type>jar</type> 
    <scope>compile</scope> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-servlet-core</artifactId> 
    <version>2.0-m07-1</version> 
    <type>jar</type> 
    <scope>compile</scope> 
</dependency> 

你必须定义在init-PARAM正则表达式,如果你想为CSS,JSP等

另一个不错的选择是为您的服务使用版本化路径(“/ v1/*”),然后静态内容将在没有过滤器的情况下运行。

+2

做,如果我没有错,你可以不再为此在2.X版本。 com.sun.jersey.spi.container.servlet.ServletContainer不属于球衣2.X我认为。 – FUD

+0

更新了包含2.x选项的答案。包已经改变了。 – condit

+1

也许没有真正相关,但我想知道是否可以通过“编程方式”/ Annotation/Properties来设置这些参数。看起来像JEE6这是不可能的。有了JEE7,它可能通过Application.getProperites()。put(key,value)? – icyerasor

9

您应添加forwardOn404过滤器来解决这一问题

<filter> 
     <filter-name>org.glassfish.jersey.examples.bookstore.webapp.MyApplication</filter-name> 
     <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>org.glassfish.jersey.examples.bookstore.webapp.MyApplication</param-value> 
     </init-param> 
     <!-- pass to next filter if Jersey/App returns 404 --> 
     <init-param> 
      <param-name>jersey.config.servlet.filter.forwardOn404</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 

如本例https://github.com/jersey/jersey/blob/2.17/examples/bookstore-webapp/src/main/webapp/WEB-INF/web.xml

+3

对于Jersey 1.x,它的'com.sun.jersey.config.feature.FilterForwardOn404' –