2012-03-07 18 views
6

Estoy intentando @Inject un grano @SessionScoped en un filtroUsando CDI de inyección en un servlet

@WebFilter("/*") 
public class IdentityFilter implements Filter, Serializable { 

    @Inject 
    private LoginUser loginUser; 
... 

donde LoginUser es @SessionScoped

la intención es que loginUser para representar el usuario conectado a la sesión.

El problema es que parece que no siempre obtengo el loginUser de la sesión actual, estoy obteniendo 'fugas' entre sesiones ya que el objeto LoginUser de una sesión se está compartiendo con otra sesión. Obviamente esto no es bueno.

Me pregunto si esto se debe a que el objeto Filter es un singleton, o al menos reutilizado entre solicitudes y sesiones por el contenedor (glassfish). (¿Correcto?)

¿Existe una forma mejor de obtener el objeto LoginUser para la sesión actual sin utilizar una propiedad en el filtro?

+0

¿Podría pegar el código LoginUser? Si no tiene un constructor no privado sin parámetros o la clase es definitiva o tiene un método final, no funcionará. –

+0

Gracias Fabricio. Creo que esto está bien, se inyecta, así debe ser. El problema es compartir ... Creo que encontré lo que está mal, lo publicaré. – Jonathan

Respuesta

8

Mi problema es que solo hay una instancia del filtro en el contenedor, efectivamente un singleton. Parece que CDI inyecta el primer objeto de nivel de sesión en el filtro en el primer uso y luego el filtro almacena esa referencia para siempre, incluso para otras sesiones.

que he encontrado esta solución, para inyectar un objeto de fábrica (Instancia), que puedo usar para obtener la instancia de sesión cada vez que se ejecuta el filtro, es decir

@WebFilter("/*") 
public class IdentityFilter implements Filter, Serializable { 

     @Inject 
     private Instance<LoginUser> loginUserSource; 

Y en

@Override 
public void doFilter(...) 
     LoginUser login = loginUserSource.get(); 

Esto parece solucionar mi problema.

Gracias

+4

En realidad, CDI funciona usando proxys y esa no es la instancia actual de LoginUser que se inyecta siempre y cuando no tenga un alcance Dependiente y cumpla con los requisitos de mi primer comentario. –

+2

+1 a la respuesta de Fabricio Lemos. CDI proporciona proxies. Esto es obligatorio por la especificación CDI (para todos los beans NormalScoped). Asegúrese de que @SessionScoped que usa realmente sea el CDI (javax.enterprise.context.SessionScoped) y NO p. el de JSF (java.faces.bean.SessionScoped). Este es un error común y ocurre si su IDE solo importa automáticamente la anotación del paquete incorrecto. Esos ámbitos JSF se consideran heredados desde EE6 e incluso pueden quedar obsoletos en futuras versiones JSF. – struberg

Cuestiones relacionadas