Java EE 6: come chiamare il bean di sessione Stateful dal bean di sessione Stateless?


Ho un bean di sessione Stateful (SFSB) che funge da modulo di autenticazione. Nel SFSB memorizzo l'utente corrente che ha effettuato l'accesso. Inoltre ho alcune facciate (che sono bean di sessione Stateless (SLSB)) che gestiscono le cose JPA/SQL per le mie entità. Per verificare le autorizzazioni di accesso dell'utente corrente, provo a chiamare SFSB fuori da SLSB. Ma il campo utente corrente è sempre "null" quando viene chiamato da SLSB. Quando si chiama direttamente SFSB, viene impostato il campo utente corrente correttamente... Per chiamare uso l'annotazione @EJB.

Qualche idea su quale potrebbe essere il problema? È in qualche modo un problema di contesto? È generalmente possibile chiamare un SFSB da SLSB preservando il suo stato?

Molte grazie in anticipo!

Author: salocinx, 2012-07-11

3 answers

Non si dovrebbe chiamare un bean di sessione stateful da un bean di sessione stateless.

Ecco alcune letture: JEE6 Tutorial-Session Beans

I bean stateless non sanno nulla della tua sessione. Ogni volta che lo chiami, è apolide. Quindi chiama un bean di sessione stateful. Non sorprende che non abbia alcun contesto relativo allo stato della sessione del client perché viene chiamato dall'oggetto stateless.

Non lo so se funzionerà, ma forse potresti provare per ottenere il contesto facendo una ricerca JNDI invece di usare la notazione @EJB. Qualcosa di simile nell'ejb senza stato potrebbe funzionare. Probabilmente dovrai giocarci e non posso garantire nulla. Dovrebbe ottenere il contesto del client che chiama l'ejb stateless. Il client dovrà avere contesto/ambito di sessione o dimenticarlo.

@Resource SessionContext sessionContext;

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

È meglio chiamare il bean di sessione stateful da un client che ha un ambito di sessione o da un altro ejb stateful. Stateless e stateful hanno diverse ragioni per essere.

 8
Author: Bill Rosmus, 2012-07-11 17:38:21

Non si deve iniettare un EJB stateful in un EJB stateless. Ciò può avere conseguenze molto imprevedibili, perché il ciclo di vita di un EJB stateful viene avviato quando iniettato e gestito dal possesso di bean. Nel peggiore dei casi, EJB stateless può essere riutilizzato da application server per utenti diversi, che accederebbero quindi allo stesso EJB stateful. Nel tuo caso, un utente verrebbe identificato come un utente diverso.

Molto probabilmente si desidera associare un EJB stateful alla sessione HTTP corrente, che non è fatto automaticamente come molte persone suppongono. Per maggiori dettagli, leggere la sezione denominata EJB 3 Non è contestuale qui: Contexts and Dependency Injection article

Per associare un EJB stateful alla sessione, è necessario iniettare stateful EJB in session scoped CDI bean, che può essere iniettato liberamente in un bean stateless - in realtà viene iniettato solo uno stub e session scoped bean (insieme a stateful EJB) viene creato per ogni nuova sessione.

Forse anche un approccio migliore consiste nell'estrarre l'interfaccia del bean stateful e utilizzare un produttore CDI per creare un'implementazione con ambito di sessione del bean sateful. In questo modo puoi anche gestire il caso, quando un EJB stateful viene automaticamente rimosso su un'eccezione nell'EJB. In tal caso, potresti voler ricreare l'EJB all'interno della stessa sessione.

 4
Author: OndrejM, 2014-09-15 20:16:36

Se si inietta il bean di sessione stateful all'interno del bean stateless di look-up, inoltre, non funziona perché verrà creata una nuova istanza per il bean stateful in modo che non contenga alcun valore come le informazioni utente registrate e così via...

 0
Author: user1023877, 2013-06-07 03:03:12