2012-07-11 23 views
6

Mam Stateful Session Bean (SFSB), który działa jako moduł uwierzytelniania. W SFSB przechowuję bieżącego użytkownika, który jest zalogowany. Ponadto mam kilka fasad (które są bezstanowymi ziarnami sesji (SLSB)), które obsługują pliki JPA/SQL dla moich jednostek. Aby sprawdzić uprawnienia dostępu bieżącego użytkownika, próbuję wywołać SFSB z SLSB. Ale bieżące pole użytkownika zawsze ma wartość "null" po wywołaniu z SLSB. Podczas bezpośredniego wywoływania SFSB, bieżące pole użytkownika jest ustawione poprawnie ... Do wywoływania używam adnotacji @EJB.Java EE 6: Jak nazwać stanową kawę sesyjną z bezpaństwowego ziarna sesji?

Jakieś pomysły na temat problemu? Czy to w jakiś sposób problem kontekstowy? Czy na ogół można wywołać SFSB z SLSB zachowując jego stan?

Wielkie dzięki z góry!

+0

Być może możesz spróbować przekazać referencję do SFSB do swojego SLSB ...Nigdy tego nie próbowałem, ale wygląda na to, że to może zadziałać. – jahroy

+0

Tak, właśnie to próbuję zrobić, używając iniekcji zależności za pomocą adnotacji @EJB. ale to nie działa ... – salocinx

+1

Nie mówiłem o zastrzyku zależności. Miałem na myśli przekazanie SFSB jako parametru metody. Wstrzyknięcie zależności nie ma sensu w tym scenariuszu. Pamiętaj, że SLSB po prostu siedzą w basenie czekając na zgłoszenia serwisowe. Nie mają żadnego stanu i nie mają pojęcia, kto ich wzywa. Po prostu wykonują zadania. – jahroy

Odpowiedz

8

Nie powinieneś wywoływać stanuowego komponentu bean sesji z bezstanowego komponentu bean sesji.

Oto lektura: JEE6 Tutorial - Session Beans

Stateless fasoli nie wiem nic na temat sesji znać. Za każdym razem, gdy to nazwiesz, jest to bezpaństwowiec. Następnie wywołuje stanowy komponent bean sesji. Nic dziwnego, że nie ma żadnego kontekstu związanego ze stanem sesji klienta, ponieważ jest wywoływany z obiektu bezpaństwowca.

Nie wiem, czy to zadziała, ale prawdopodobnie można spróbować uzyskać kontekst, wykonując wyszukiwanie JNDI zamiast DI za pomocą zapisu @EJB. Coś takiego w bezstanowym ejb może zadziałać. Prawdopodobnie będziesz musiał się z tym bawić i nie gwarantuję niczego. Powinien uzyskać kontekst klienta wywołującego bezpaństwowcowy ejb. Klient będzie musiał mieć kontekst sesji/zakres lub go zapomnieć.

@Resource SessionContext sessionContext; 

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

Lepiej wywołać stanowy komponent bean sesji z klienta, który ma zasięg sesji lub inny stanowy interfejs ejb. Bezpaństwowcy i stanowe mają różne powody bycia.

+0

dzięki za odpowiedź. ale to nie działa dla mnie ... SFSB wciąż nie ma kontekstu sesji. jakieś inne pomysły? – salocinx

+0

Aby użyć SessionContext po prostu musi być pomyślnie uwierzytelniony przed sfery bezpieczeństwa. – salocinx

0

Jeśli wstrzyknąć pełnostanowego bean sesji bezstanowej fasoli wewnątrz przez look-up też nie działa, ponieważ nowa instancja zostanie utworzona dla stanowej fasoli więc nie posiada żadnych wartości, takich jak informacje zalogowanego użytkownika i etc ...

4

Nie należy wstrzykiwać stanowego adaptera EJB w bezpaństwowy komponent EJB. Może to mieć bardzo nieprzewidywalne konsekwencje, ponieważ cykl życia stanowego EJB rozpoczyna się po wstrzyknięciu i zarządzaniu przez posiadanie ziarna. W najgorszym przypadku statyczny EJB może zostać ponownie użyty przez serwer aplikacji dla różnych użytkowników, który uzyska dostęp do tego samego, stanowego EJB. W Twoim przypadku użytkownik zostanie zidentyfikowany jako inny użytkownik.

Najprawdopodobniej chcesz powiązać stanowy komponent EJB z bieżącą sesją HTTP, która nie jest wykonywana automatycznie, jak przypuszcza wiele osób. Aby uzyskać więcej informacji przeczytaj rozdział o nazwie EJB 3 Nie z kontekstu tutaj: Contexts and Dependency Injection article

Aby skojarzyć pełnostanowego EJB z sesji, trzeba wstrzyknąć pełnostanowego EJB w sesji scoped CDI fasola, który może być wstrzykiwany swobodnie do bezpaństwowym fasoli - w rzeczywistości wstrzykiwany jest tylko kod pośredniczący, a dla każdej nowej sesji tworzony jest komponent bean z zakresem sesji (wraz z stanowym komponentem EJB).

Może jeszcze lepszym podejściem jest wyodrębnienie interfejsu z komponentu bean stanowej i użycie producenta CDI do utworzenia implementacji somatycznego komponentu obsługującego sesję. W ten sposób można również obsłużyć przypadek, gdy stanowy komponent EJB zostanie automatycznie usunięty z wyjątku w komponencie EJB. W takim przypadku możesz odtworzyć EJB w tej samej sesji.