2012-07-11 235 views
6

我有一個充當身份驗證模塊的有狀態會話Bean(SFSB)。在SFSB中,我存儲當前登錄的用戶。此外,我還有一些Facades(無狀態會話Bean(SLSB)),它處理我的實體的JPA/SQL資料。爲了檢查當前用戶的訪問權限,我嘗試從SLSB中調用SFSB。但是當從SLSB調用時,當前用戶字段始終爲「空」。當直接調用SFSB時,當前用戶字段設置正確......對於調用,我使用@EJB註釋。Java EE 6:如何從無狀態會話Bean調用有狀態會話Bean?

任何想法可能是什麼問題?這在某種程度上是一種背景問題嗎?通常可以從SLSB調用SFSB來保持它的狀態?

非常感謝提前!

+0

也許你可以嘗試將一個SFSB的引用傳遞給你的SLSB ...從來沒有嘗試過,但它似乎可能工作。 – jahroy 2012-07-11 17:49:53

+0

是的,這正是我想通過@EJB註釋使用依賴注入來實現的。但這不起作用... – salocinx 2012-07-12 08:09:07

+1

我不是指依賴注入。我的意思是通過SFSB作爲方法參數。在這種情況下依賴注入是沒有意義的。請記住,SLSB只是坐在等待服務請求的游泳池中。他們根本沒有國家,也不知道誰在援引他們。他們只是執行任務。 – jahroy 2012-07-12 16:44:37

回答

8

您不應該從無狀態會話bean中調用有狀態會話bean。

下面是一些閱讀:JEE6 Tutorial - Session Beans

無國籍豆不知道你會什麼。無論何時你稱它爲無狀態。然後它調用一個有狀態的會話bean。毫不奇怪,它沒有任何關於客戶端會話狀態的上下文,因爲它是從無狀態對象中調用的。

我不知道它是否可以工作,但是您可能會嘗試通過使用@EJB表示法進行JNDI查找而不是DI來獲取上下文。無狀態ejb中的這種情況可能會起作用。你可能需要玩它,我不能保證任何東西。它應該獲得調用無狀態ejb的客戶端的上下文。客戶端需要擁有會話上下文/範圍或忘記它。

@Resource SessionContext sessionContext; 

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

最好從具有會話範圍的客戶端或從另一個有狀態的ejb調用有狀態會話bean。無狀態和有狀態存在着不同的原因。

+0

感謝您的回答。但這對我不起作用...... SFSB仍然沒有會話上下文。任何其他想法? – salocinx 2012-07-12 08:07:51

+0

爲了使用SessionContext,必須在之前成功驗證過安全領域。 – salocinx 2014-10-10 10:03:47

0

如果通過查找注入無狀態bean中的有狀態會話Bean也不起作用,因爲新的實例將爲狀態bean創建因此它不會像持有記錄用戶信息和等任何值......

4

您不應該將有狀態的EJB注入到無狀態的EJB中。這可能具有非常不可預測的後果,因爲有狀態的EJB的生命週期是在擁有bean注入和管理時開始的。在最壞的情況下,無狀態的EJB可以被應用服務器重複用於不同的用戶,然後它們將訪問相同的有狀態的EJB。在你的情況下,用戶將被識別爲不同的用戶。

大多數情況下,您希望將有狀態的EJB與當前的HTTP會話關聯起來,而不是像許多人所想的那樣自動完成。有關詳細信息讀取命名EJB部分3未語境這裏:Contexts and Dependency Injection article

爲了有狀態EJB與會話相關聯,你需要注入狀態EJB到會話範圍的CDI bean,它可以自由地被注入到無狀態Bean - 實際上只有一個存根被注入,並且爲每個新的會話創建會話範圍的bean(與有狀態的EJB一起)。

也許更好的辦法是提取有狀態bean的接口,並使用CDI生成器來創建會話作用域的實現bean。這樣,當EJB中的異常自動刪除有狀態的EJB時,您也可以處理這種情況。在這種情況下,您可能希望在同一個會話中重新創建EJB。