2011-08-07 9 views
7

Quiero inyectar el usuario actual usando @Inject @Current User en todas las capas (es decir, capa web, capa EJB). Con el fin de hacer esto, tengo el siguiente método CDI Productor:Llamar a un método de productor con ámbito de sesión CDI desde un bean de sesión sin estado EJB

@Named 
@SessionScoped 
public class UserController { 
    @Resource SessionContext sessionContext; 
    @EJB UserDao userDao; 

    @Produces @Current 
    public User getCurrentUser() { 
    String username = sessionContext.getCallerPrincipal().getName(); 
    User user = userDao.findByUsername(username); 
    } 
} 

@Qualifier 
@Target({TYPE, METHOD, PARAMETER, FIELD}) 
@Retention(RUNTIME) 
public @interface Current{} 

Ahora, quiero inyectar el usuario actual en un bean de sesión sin estado EJB de la siguiente manera:

@Stateless 
public class SomeBackendService { 
    @Inject @Current 
    private User user; 
} 

Mi pregunta: ¿Es el objeto de usuario actual siempre vuelve a inyectarse después de que la sesión cambia, porque las dependencias de un bean de sesión sin estado normalmente se inyectan una vez en el momento de la creación y el bean se puede agrupar y usar en diferentes sesiones?

Respuesta

4

Aunque no he probado esta situación exacta, en CDI los frijoles normalmente no se vuelven a inyectar. En cambio, se inyecta un proxy que conoce su contexto.

A través de este mecanismo, es posible inyectar un bean con ámbito de sesión en un bean con ámbito de la aplicación. Cada usuario del bean con ámbito de la aplicación va al mismo bean y al mismo proxy, pero el proxy resolverá dinámicamente las llamadas en un bean diferente para cada usuario.

Así que aunque el alcance de @Stateless es básicamente 'aplicación', es posible que el proxy que representa User en su `SomeBackendService 'todavía delegue a la versión de ámbito de sesión correcta.

p.s.

Si con capas en realidad se refiere a módulos como en los módulos web y EJB que forman parte de una oreja, que va a ser un poco más complicado, ya que no hace CDI siempre funciona como se esperaba entre los módulos (especialmente en JBoss AS). Esto se debe en parte a la ambigüedad de lo que es una "aplicación" y, por lo tanto, el alcance de la aplicación dentro de un EAR.

+0

olvidó totalmente los proxies. Lo intenté y funciona como esperaba. Gracias. – Theo

1

Por diseño, su bean de sesión sin estado no debe tener un estado "Usuario", es apátrida por supuesto.

Si desea que su EJB tenga estados, utilice @Stateful en su lugar.

1

Sí, a cada método de negocio llamado contenedor se reinyectará todas las dependencias de su SLSB. Aquí hay texto que garantiza esto en la especificación EJB 3.1:

"Si un bean de sesión utiliza la inyección de dependencia, el contenedor inyecta estas referencias después de que se crea la instancia de bean, y antes de invocar cualquier método comercial en la instancia de bean. " - Sección 4.3.2

que tenía esta duda también y he publicado una pregunta explicar esta situación here

Cuestiones relacionadas