Jersey / * servlet映射导致静态资源出现404错误 [英] Jersey /* servlet mapping causes 404 error for static resources
问题描述
如果我将Jersey的url-pattern映射到2.0版本中的/ *,则会导致所有静态资源的404(例如/index.html)。我的web.xml包含:
< 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>
如何使用相同的网址格式提供静态内容?
使用Jersey 1.x,如果从Jersey servlet切换到同一路径,您应该能够提供静态内容过滤器。删除您指定的servlet XML并将其切换为:
< filter>
< filter-name>泽西过滤器< / 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>泽西过滤器< / filter-name>
< url-pattern> / *< / url-pattern>
< / filter-mapping>
编辑:在泽西岛2.x你应该可以做到同样的事情,但属性的名称已被更改。尝试类似:
< filter>
< filter-name>泽西过滤器< / 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>泽西过滤器< / 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>
<依赖>
< 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>
如果要提供css,则必须在init-param中自定义正则表达式, jsp等。
另一个好的选择是为你的服务使用版本化路径(/ v1 / *),然后静态内容将在没有过滤器的情况下工作。 / p>
If I map Jersey's url-pattern to /* in the 2.0 release it causes 404 for all static resources (e.g. /index.html). My web.xml has:
<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>
How do I serve static content with same url pattern?
With Jersey 1.x you should be able to serve static content from the same path if you switch from the Jersey servlet to the filter. Drop the servlet XML you've specified and switch it to:
<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>
EDIT: In Jersey 2.x you should be able to do the same thing but the names of the properties have been changed. Try something like:
<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>
And your POM should include:
<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>
You'll have to customize the regular expression in the init-param if you want to serve css, jsp, etc.
Another good option is to use a versioned path for your services ("/v1/*") and then static content will work without the filter.
这篇关于Jersey / * servlet映射导致静态资源出现404错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!