2012-09-14 16 views
19

Si asigno el url-pattern de Jersey a/* en la versión 2.0, genera 404 para todos los recursos estáticos (por ejemplo, /index.html). Mi web.xml tiene:El mapeo de servlet Jersey/* provoca un error 404 para recursos estáticos

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

¿Cómo se sirve contenido estático con el mismo patrón de URL?

Respuesta

24

Con Jersey 1.x, debe poder servir contenido estático de la misma ruta si cambia del servlet Jersey al filtro. La caída de la servlet XML que ha especificado y cambie 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: En Jersey 2.x que debería ser capaz de hacer lo mismo, pero los nombres de las propiedades se han cambiado. Pruebe algo como:

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

Y el POM debe incluir:

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

Vas a tener que personalizar la expresión regular en el init-param si desea servir CSS, JSP, etc.

Otra buena opción es utilizar una ruta versionada para sus servicios ("/ v1/*") y luego el contenido estático funcionará sin el filtro.

+2

Si no estoy equivocada ya no se puede hacer esto en versiones 2.x. com.sun.jersey.spi.container.servlet.ServletContainer no es parte de jersey 2.X, creo. – FUD

+0

Se actualizó la respuesta para incluir una opción 2.x. El paquete ha cambiado. – condit

+1

No muy relacionado tal vez, pero me preguntaba si sería posible establecer estos parámetros "programáticamente"/Anotación/Propiedades. Parece que con JEE6 esto no es posible. Con JEE7 podría ser, a través de Application.getProperites(). Put (clave, valor)? – icyerasor

9

Usted deberá agregar el filtro forwardOn404 para abordar esta cuestión

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

Como se ha hecho en este ejemplo https://github.com/jersey/jersey/blob/2.17/examples/bookstore-webapp/src/main/webapp/WEB-INF/web.xml

+3

Para Jersey 1.x, es 'com.sun.jersey.config.feature.FilterForwardOn404' –

Cuestiones relacionadas