2012-09-14 10 views
19

Wenn ich Jersey's URL-Muster zu/* in der 2.0-Version zuordnen, verursacht 404 für alle statischen Ressourcen (z. B. /index.html). Meine web.xml hat:Jersey/* Servlet Mapping verursacht 404 Fehler für statische Ressourcen

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

Wie kann ich statischen Inhalt mit demselben URL-Muster liefern?

Antwort

24

Mit Jersey 1.x sollten Sie in der Lage sein, statischen Inhalt vom selben Pfad zu liefern, wenn Sie vom Jersey-Servlet zum Filter wechseln. Löschen Sie die Servlet XML Sie angegeben haben, und schalten Sie es an:

<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 sollten Sie in der Lage sein, das Gleiche zu tun, aber die Namen der Eigenschaften wurden geändert. Versuchen Sie so etwas wie:

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

Und Ihre POM sollte folgendes beinhalten:

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

Sie werden den regulären Ausdruck in der init-param anpassen, wenn Sie CSS dienen wollen, jsp, usw.

Eine andere gute Option ist die Verwendung eines versionierten Pfades für Ihre Dienste ("/ v1/*") und dann wird statischer Inhalt ohne den Filter funktionieren.

+2

Wenn ich nicht falsch bin, kann man nicht mehr diese Versionen in 2.x tun. com.sun.jersey.spi.container.servlet.ServletContainer ist nicht Teil von Jersey 2.X denke ich. – FUD

+0

Die Antwort wurde aktualisiert, um eine 2.x-Option hinzuzufügen. Das Paket hat sich geändert. – condit

+1

Nicht wirklich verwandt vielleicht, aber ich fragte mich, ob es möglich wäre, diese Parameter "programmgesteuert"/Annotation/Eigenschaften zu setzen. Scheinbar mit JEE6 ist das nicht möglich. Mit JEE7 könnte es sein, durch Application.getProperites(). Put (Schlüssel, Wert)? – icyerasor

9

Du sollst die forwardOn404 Filter hinzufügen, um dieses Problem in diesem Beispiel

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

Wie getan Adresse https://github.com/jersey/jersey/blob/2.17/examples/bookstore-webapp/src/main/webapp/WEB-INF/web.xml

+3

Für Jersey 1.x, seine 'com.sun.jersey.config.feature.FilterForwardOn404' –

Verwandte Themen