2012-09-14 18 views
19

Se si esegue il mapping dell'url di Jersey a/* nella versione 2.0, esso causa 404 per tutte le risorse statiche (ad esempio /index.html). Il mio web.xml ha:Jersey/* mappatura servlet causa l'errore 404 per le risorse statiche

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

Come si serve il contenuto statico con lo stesso modello di URL?

risposta

24

Con Jersey 1.x dovresti essere in grado di servire contenuto statico dallo stesso percorso se passi dal servlet di Jersey al filtro. Drop the XML servlet che hai specificato e passare a:

<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 si dovrebbe essere in grado di fare la stessa cosa, ma i nomi delle proprietà sono stati cambiati. Provare qualcosa di simile:

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

E il tuo POM dovrebbe includere:

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

Dovrete personalizzare l'espressione regolare nella init-param se si vuole servire css, jsp, ecc

Un'altra buona opzione è utilizzare un percorso con versione per i servizi ("/ v1/*") e il contenuto statico funzionerà senza filtro.

+2

Se non sbaglio non è più possibile farlo in versioni 2.x. com.sun.jersey.spi.container.servlet.ServletContainer non fa parte della maglia 2.X penso. – FUD

+0

Aggiornamento della risposta per includere un'opzione 2.x. Il pacchetto è cambiato. – condit

+1

Magari non correlati, ma mi chiedevo se fosse possibile impostare questi parametri "programmaticamente"/Annotazione/Proprietà. Sembra che con JEE6 questo non sia possibile. Con JEE7 potrebbe essere, tramite Application.getProperites(). Put (chiave, valore)? – icyerasor

9

Si deve aggiungere il filtro forwardOn404 per affrontare questo problema

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

Come fatto in questo esempio https://github.com/jersey/jersey/blob/2.17/examples/bookstore-webapp/src/main/webapp/WEB-INF/web.xml

+3

Per Jersey 1.x, il suo 'com.sun.jersey.config.feature.FilterForwardOn404' –

Problemi correlati