2010-09-19 29 views
5

Estoy usando Jersey 1.4 ea junto con Spring 3.0 y la integración jersey-spring. Integrar Jersey y Spring funciona bien para clases de recursos como se describe en here. Como quiera que quiera inyectar un componente de resorte en un ContainerRequestFilter para hacer un preprocesamiento de solicitudes.Jersey: Inyecte el componente Spring en ContainerRequestFilter

@Component 
public class SecurityFilter implements ContainerRequestFilter { 

    // UserManager is a declared spring component 
    // Injecting it should work somehow 
    @Autowired 
    private UserManager userManager; 

    @Override 
    public ContainerRequest filter(ContainerRequest request) { 
     System.out.println(userManager); 
     // prints out null on request 
    } 
} 

Tanto el filtro como el administrador de usuarios se registran al implementar la aplicación en Glassfish. Me pregunto qué estoy haciendo mal. ¿Hay alguna forma de inyectar un frijol administrado por la primavera en un ContainerRequestFilter?

ACTUALIZACIÓN

tipo de solución. El problema es que Jersey no obtiene Spring beans si estos beans son proxies de Java (se oponen a las clases proxy generadas). El problema puede resolverse ordenando a Spring que SIEMPRE use clases de proxy en lugar de Java Proxies especificando el atributo proxy-target-class="true" en las partes respectivas de una configuración de resorte. En mi caso, tuve que especificarlo en un <tx:annotation-driven proxy-target-class="true" />.

Consulte here para un análisis más detallado y una posible solución a eso.

+0

En su solución, ¿cómo se ha registrado SecurityFilter en el archivo web.xml o en otro lugar? Tengo un problema aquí https://stackoverflow.com/q/45509183/4636715 en el que ContainerRequestFilter no se visita en absoluto. – vahdet

Respuesta

2

Estoy viendo lo mismo con Jersey 1.6 y Spring 3.0.5. Usando el depurador, puedo decir que a pesar de que mi código está marcado con @Component, tanto en primavera y Jersey a instancia de su propia copia de esta clase:

@Path("/beams") 
@Produces("text/xml") 
@Component 
@Scope("singleton") 
public class BeamsResource { 
} 

Hay algunos comentarios que esto se añadirán en un futuro versión de Jersey, pero parece que no funciona ahora. Sé que esta es una solución horrible, pero estoy usando una variable de miembro estática para conectar Jersey y Spring por el momento. Bleh.

+1

Finalmente encontré una solución para esto. Al depurar el código, resultó ser un problema en la forma en que Jersey obtiene Spring beans del contexto. Mis pensamientos están documentados http://jersey.576304.n2.nabble.com/AW-Jersey-ContainerRequestFilter-as-Spring-component-td5724265.html – nre

+0

Consulte también la actualización de mi pregunta. – nre

Cuestiones relacionadas