Estoy tratando de interceptar una solicitud para mi JAX-RS webservice por un ContainerRequestFilter. Quiero usarlo con una anotación, por lo que puedo decorar ciertos métodos del servicio web. Esto debería permitir a mí para manejar las solicitudes a este métodos basados en la información de si están hechas por un canal seguro
o no, antes de que el real se ejecuta el método.

He probado diferentes enfoques, buscado en varios posts y luego implementado en su mayoría basadas en la respuesta por Alden en este post.
Pero no puedo hacerlo funcionar.

Tengo un método de prueba en mi webservice decoradas con mi costumbre de anotación Ssl.

@POST
@Path("/test")
@Ssl
public static Response test(){      
    System.out.println("TEST ...");
}

La anotación se parece a esto:

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface Ssl {}

Luego me la instalación de un filtro de aplicación

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;

@Ssl
@Provider
public class SslInterceptor implements ContainerRequestFilter
{
    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException
    {       
        System.out.println("Filter executed.");
    }
}

Pero el filtro no se ejecuta nunca, ni allí se producen los mensajes de error o advertencias. El método de prueba se ejecuta bien, de todos modos.

Para resolver, he intentado registrar el filtro en la web.xml como se describe aquí.

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

    <init-param>
      <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
      <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
    </init-param>

    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.my.packagewithfilter</param-value>
    </init-param>

    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.my.packagewithfilter.SslInterceptor</param-value>
    </init-param>

    <init-param>  
      <param-name>jersey.config.server.provider.packages</param-name>  
      <param-value>com.my.packagewithfilter</param-value>
    </init-param>    

  </servlet>

Pero que también no funciona. Lo que me estoy perdiendo? Alguna idea de cómo hacer que el trabajo de filtro? Cualquier ayuda es muy apreciada!

OriginalEl autor tareq | 2014-02-04

3 Comentarios

  1. 9

    Está utilizando JAX-RS 2.0 Api (solicitud de filtros, nombre de la unión, …) en sus clases, sino Jersey 1 de propiedad de inicialización de parámetros en su web.xml (paquete de inicio con com.sun.jersey, Jersey 2 utiliza org.glassfish.jersey). Echa un vistazo a este respuesta y en estos artículos:

    Gracias por esta aclaración. Soy consciente, yo no estaba seguro de qué clases de referencia en el web.xml. De hecho, tengo el trabajo del filtro utilizando com.sol.jersey.spi.contenedor.ContainerRequestFilter en lugar de javax.ws.rs.contenedor.ContainerRequestFilter. Pero que su mundial justo y por lo que es inútil para mi caso. Supongo que NameBinding para el método no funciona, porque yo uso jersey 1.x. Pero tratando de cambiar a jersey 2.x me puso de los principales problemas con el arranque del proyecto en tomcat. Tal vez debería intentarlo de nuevo y espero que resuelve los problemas.
    Ahora he creado un nuevo limpio JAX-RS proyecto sólo se basa en Jersey 2. Ahora puedo usar javax.ws.rs.contenedor.ContainerRequestFilter y se unen a ciertos métodos de mis servicios. funciona perfectamente ahora. Gracias!!

    OriginalEl autor Michal Gajdos

  2. 2

    Solo compilar la respuesta de Michael Gajdos para ayudar a alguien que no quiere abrir más pestañas:

    Cuando se utiliza Jersey-2, usted debe utilizar la siguiente configuración para registrar su filtro en la web.xml

    jersey.config.servidor.proveedor de.los nombres de clases

    lugar de

    com.sol.jersey.spi.contenedor.ContainerRequestFilters (jersey-1x)

     <!-- This is the config needed -->
    <servlet>    
          //...         
         <init-param>
             <param-name>jersey.config.server.provider.classnames</param-name>
             <param-value>com.your_package_path.yourClassFilter</param-value>
         </init-param>
          //...
    </servlet>

    OriginalEl autor Vitorlui

  3. 0

    Echar un vistazo a este blog para los más ‘clásica’ de los enfoques (sin el uso de la anotación)

    OriginalEl autor ACV

Dejar respuesta

Please enter your comment!
Please enter your name here