services - rest with java example
La asignación de servlet de Jersey/* causa un error 404 para recursos estáticos (2)
Con Jersey 1.x debería poder servir contenido estático desde la misma ruta si cambia del servlet de Jersey al filtro. Suelte el servlet XML que ha especificado y cámbielo 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>
EDITAR: En Jersey 2.x debería poder hacer lo mismo pero se han cambiado los nombres de las propiedades. Intenta 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 su 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>
Tendrá que personalizar la expresión regular en el init-param si desea servir css, jsp, etc.
Otra buena opción es usar una ruta versionada para sus servicios ("/ v1 / *") y luego el contenido estático funcionará sin el filtro.
Si mapeo el patrón de url de Jersey a / * en la versión 2.0, causa 404 para todos los recursos estáticos (por ejemplo, /index.html). Mi web.xml tiene:
<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 sirvo contenido estático con el mismo patrón de url?
Debe agregar el filtro forwardOn404 para abordar este 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>
Como se hace en este ejemplo, https://github.com/jersey/jersey/blob/2.17/examples/bookstore-webapp/src/main/webapp/WEB-INF/web.xml
Nota: asegúrese de que está cambiando la configuración de <servlet>
a una configuración de <filter>
. El ServletContainer
Jersey es tanto un HttpServlet
como un Filter
, por lo que puede configurarlo como en su web.xml. Para utilizar la propiedad forwardOn404
, Jersey debe configurarse como filtro.