2012-07-11 19 views
6

Tengo un Stateful Session Bean (SFSB) que actúa como módulo de autenticación. En el SFSB, almaceno el usuario actual que está conectado. Además, tengo algunas fachadas (que son beans de sesión sin estado (SLSB)) que manejan el material JPA/SQL para mis entidades. Para verificar los permisos de acceso del usuario actual, intento llamar al SFSB fuera del SLSB. Pero el campo de usuario actual siempre es "nulo" cuando se llama desde SLSB. Al llamar directamente al SFSB, el campo del usuario actual está configurado correctamente ... Para las llamadas, uso la anotación @EJB.Java EE 6: ¿Cómo llamar a Stateful Session Bean desde Stateless Session Bean?

¿Alguna idea de lo que podría ser el problema? ¿Es eso de alguna manera un problema de contexto? ¿Es generalmente posible llamar a un SFSB desde SLSB preservando su estado?

¡Muchas gracias de antemano!

+0

Quizás podría intentar pasar una referencia a un SFSB a su SLSB ...Nunca lo intenté, pero parece que podría funcionar. – jahroy

+0

sí, eso es exactamente lo que intento hacer mediante el uso de la inyección de dependencia con la anotación @EJB. pero esto no funciona ... – salocinx

+1

No me refería a la inyección de dependencia. Me refería a pasar el SFSB como un parámetro de método. La inyección de dependencia no tiene sentido en este escenario. Recuerde que los SLSB simplemente se sientan en una piscina esperando las solicitudes de servicio. No tienen ningún estado y no tienen idea de quién los invoca. Simplemente ejecutan tareas. – jahroy

Respuesta

8

No debe llamar a un bean de sesión con estado desde un bean de sesión sin estado.

Aquí es un poco de lectura: JEE6 Tutorial - Session Beans

granos sin estado no saben nada acerca de su sesión. Cada vez que lo llamas, es apátrida. Luego llama a un bean de sesión con estado. No es de sorprender que no tenga ningún contexto relacionado con el estado de la sesión del cliente porque se llama desde un objeto sin estado.

No sé si funcionará, pero podría tratar de obtener el contexto haciendo una búsqueda JNDI en lugar de DI utilizando la notación @EJB. Algo como esto en el ejb sin estado podría funcionar. Probablemente tengas que jugar con eso y no puedo garantizar nada. Debería obtener el contexto del cliente que llama al ejb sin estado. El cliente deberá tener el contexto/alcance de la sesión o olvidarlo.

@Resource SessionContext sessionContext; 

MyStatefulBean msb = (MyStatefulBean)sessionContext.lookup("ejb/MyStatefulBean"); 
msb.doSomething(fubar); 

Es mejor llamar al bean de sesión con estado de un cliente que tiene un ámbito de sesión o de otro EJB con estado. Sin estado y con estado tienen diferentes razones para serlo.

+0

gracias por su respuesta. pero esto no funciona para mí ... el SFSB aún no tiene contexto de sesión. cualquier otra idea? – salocinx

+0

Para poder utilizar SessionContext, debe haberse autenticado con éxito antes de un dominio de seguridad. – salocinx

0

Si se inyecta el bean de sesión con estado dentro bean sin estado de look-up también no funciona porque se creará una nueva instancia de bean con estado por lo que no posee valores como la información del usuario registrado y etc ...

4

No debe inyectar un EJB con estado en un EJB sin estado. Esto puede tener consecuencias muy imprevisibles, ya que el ciclo de vida de un EJB con estado se inicia cuando se inyecta y se administra mediante la posesión de bean. En el peor de los casos, el servidor de aplicaciones puede reutilizar el EJB sin estado para diferentes usuarios, que luego accederían al mismo EJB con estado. En su caso, un usuario sería identificado como un usuario diferente.

Lo más probable es que desee asociar un EJB con estado con la sesión HTTP actual, lo que no se hace automáticamente, como suponen muchas personas. Para obtener más información, lea la sección llamada EJB 3 Is Not Contextual aquí: Contexts and Dependency Injection article

Para asociar un EJB con estado a la sesión, debe inyectar el EJB con estado en el bean CDI de sesión, que se puede inyectar libremente en un bean sin estado - en realidad, solo se inyecta un stub y se crea un bean con ámbito de sesión (junto con el EJB con estado) para cada sesión nueva.

Quizás un enfoque aún mejor sea extraer la interfaz del bean con estado, y usar un productor de CDI para crear una implementación con ámbito de sesión del bean sateful. De esta forma también puede manejar el caso, cuando un EJB con estado se elimina automáticamente en una excepción en el EJB. En tal caso, es posible que desee volver a crear el EJB dentro de la misma sesión.