jersey jersey-2.0

Jersey ContainerRequestFilter no activado



jersey-2.0 (10)

Algunos consejos:

  1. Asegúrese de estar utilizando JAX-RS versión 2.17.
  2. Asegúrese de estar utilizando las importaciones correctas en su filtro:

    • import javax.ws.rs.container.ContainerRequestContext;
    • import javax.ws.rs.container.ContainerRequestFilter;
  3. Agregue la anotación @Provider

Intento utilizar un ContainerRequestFilter para imponer cierta autenticación en una aplicación Jersey basada en Tomcat. Seguí este documento . Problema: el filtro nunca se dispara

La clase de filtro:

@Provider public class AuthFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) throws IOException { // MY AUTHENTICATION CODE GOES HERE }

El archivo web.xml:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="debate-rest" version="3.0"> <display-name>rest</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> <param-value>com.hck.debate.rest.security.AuthFilter</param-value> </init-param> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.hck.debate.rest.controller</param-value> </init-param> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>


De acuerdo, no entendí que el jersey.config.server.provider.packages init param necesita hacer referencia no solo a las clases de servicio (puntos finales API) sino a TODAS las clases, incluidos los filtros.

Ahora funciona :

<init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.hck.debate.rest.controller;com.hck.debate.rest.security</param-value> </init-param> <init-param> <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> <param-value>com.hck.debate.rest.security.AuthFilter</param-value> </init-param>


En lugar de javax.ws.rs, utilicé com.sun.jersey y funcionó

import com.sun.jersey.spi.container.ContainerRequestFilter import com.sun.jersey.spi.container.ContainerRequest

Los usuarios de Dropwizard necesitan hacer esto

environment.jersey().getResourceConfig() .getContainerRequestFilters() .add(filter);


En lugar de usar la anotación @Provider (que no funcionó en mi caso), puede registrar su ContainerRequestFilter manualmente con su JerseyServletFactory :

JerseyServletFactory jerseyServletFactory = new JerseyServletFactory(config); HttpServlet myServiceServlet = jerseyServletFactory.create(myResource); // Register your ContainerRequestFilter like this jerseyServletFactory.addRequestFilter(new MyFilter()); httpServer.register(myServiceServlet, "/api"); httpServer.start();


Los requisitos mínimos para trabajar filtros con jersey:

  • agregar la anotación @Provider a la clase de filtro
  • el espacio de nombre de la clase de filtro debe incluirse en el init-param de ''jersey.config.server.provider.packages''

No se requiere ninguna otra configuración (por ejemplo, ''init.param de'' com.sun.jersey.spi.container.ContainerRequestFilters ''o ResourceConfig)


Nos faltaba la siguiente llamada en nuestra clase de implementación ResourceConfig:

register(CorrelationIdFilter.class);


Para cualquiera que tenga este problema en MULE ESB. Recuerde registrar la ruta con:

<jersey:resources doc:name="REST"> <component doc:name="rest component"> <spring-object bean="endpoit"/> </component> <jersey:package packageName="path @Provider-s"/> </jersey:resources >


Si estuviste atascado como yo, ten en cuenta que TomEE 1.7.X utiliza JAX-RS 1.1, que no incluye ContainerRequestFilter.


También tuve que agregar la anotación @Provider JAX-RS a mis filtros.
Esto hace que el filtro sea visible durante la fase de exploración JAX-RS.

@Provider public class MyAppFilter implements ContainerRequestFilter { // filter logic }


Tuve el mismo problema con el jersey JAX-RS 2 y la anotación a continuación lo solucionó

@PreMatching