【问题标题】:Jersey /* servlet mapping causes 404 error for static resourcesJersey /* servlet 映射导致静态资源出现 404 错误
【发布时间】:2012-09-07 12:12:54
【问题描述】:

如果我在 2.0 版本中将 Jersey 的 url 模式映射到 /*,它会导致所有静态资源(例如 /index.html)出现 404。我的 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>

如何提供具有相同 url 模式的静态内容?

【问题讨论】:

    标签: java jersey


    【解决方案1】:

    使用 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>
    

    编辑: 在 Jersey 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>${jersey2.version}</version>
      <type>jar</type>
      <scope>compile</scope>
    </dependency>
    
    <dependency>
      <groupId>org.glassfish.jersey.containers</groupId>
      <artifactId>jersey-container-servlet-core</artifactId>
      <version>${jersey2.version}</version>
      <type>jar</type>
      <scope>compile</scope>
    </dependency>
    
    <!-- see. https://eclipse-ee4j.github.io/jersey/ for latest version -->
    

    如果您想提供 css、jsp 等服务,则必须在 init-param 中自定义正则表达式。

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

    【讨论】:

    • 如果我没记错的话,你不能再在 2.x 版本中执行此操作。我认为 com.sun.jersey.spi.container.servlet.ServletContainer 不是 jersey 2.X 的一部分。
    • 更新了答案以包含 2.x 选项。包已更改。
    • 可能并不真正相关,但我想知道是否可以“以编程方式”设置这些参数/注释/属性。似乎使用 JEE6 这是不可能的。对于 JEE7,它可能是通过 Application.getProperites().put(key, value)?
    • 请参阅this answer 了解您可以设置的另一个属性,而不是上述答案中的属性。
    【解决方案2】:

    您应添加 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/eclipse-ee4j/jersey/blob/master/examples/bookstore-webapp/src/main/webapp/WEB-INF/web.xml

    注意:确保将&lt;servlet&gt; 配置更改为&lt;filter&gt; 配置。 Jersey ServletContainer 既是 HttpServlet Filter,所以你可以在你的 web.xml 中配置它。 为了使用forwardOn404 属性,需要将Jersey 配置为过滤器

    【讨论】:

    • 对于 Jersey 1.x,它的 com.sun.jersey.config.feature.FilterForwardOn404
    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 2013-08-31
    • 2014-04-13
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多