2012-07-11 30 views
6

मेरे पास एक स्टेटफुल सत्र सत्र (एसएफएसबी) है जो प्रमाणीकरण मॉड्यूल के रूप में कार्य करता है। एसएफएसबी में मैं वर्तमान उपयोगकर्ता को लॉग इन करता हूं जो लॉग इन है। इसके अलावा मेरे पास कुछ मुखौटे हैं (जो स्टेटलेस सत्र बीन्स (एसएलएसबी) हैं) जो मेरी संस्थाओं के लिए जेपीए/एसक्यूएल सामान को संभालते हैं। वर्तमान उपयोगकर्ता की एक्सेस अनुमतियों की जांच करने के लिए, मैं एसएलएसबी से एसएफएसबी को कॉल करने का प्रयास करता हूं। लेकिन एसएलएसबी से बुलाए जाने पर वर्तमान उपयोगकर्ता फ़ील्ड हमेशा "शून्य" होता है। सीधे SFSB को कॉल करते समय, वर्तमान उपयोगकर्ता फ़ील्ड सही ढंग से सेट किया गया है ... कॉल करने के लिए मैं @EJB एनोटेशन का उपयोग करता हूं।जावा ईई 6: स्टेटलेस सत्र बीन से स्टेटफुल सत्र सत्र कैसे कॉल करें?

कोई विचार क्या समस्या हो सकती है? क्या यह किसी संदर्भ की समस्या है? क्या एसएलएसबी से एसएफएसबी को अपने राज्य को संरक्षित करना आम तौर पर संभव है?

अग्रिम में बहुत धन्यवाद!

+0

शायद आप अपने एसएलएसबी में एसएफएसबी के संदर्भ को पारित करने का प्रयास कर सकते हैं ...कभी कोशिश नहीं की, लेकिन ऐसा लगता है जैसे यह काम कर सकता है। – jahroy

+0

हाँ यह वही है जो मैं @EJB एनोटेशन के साथ निर्भरता इंजेक्शन का उपयोग करके करने की कोशिश कर रहा हूं। लेकिन यह काम नहीं करता है ... – salocinx

+1

मैं निर्भरता इंजेक्शन का जिक्र नहीं कर रहा था। मेरा मतलब है कि एसएफएसबी को विधि पैरामीटर के रूप में पास करना है। इस परिदृश्य में निर्भरता इंजेक्शन समझ में नहीं आता है। याद रखें एसएलएसबी बस सेवा अनुरोधों की प्रतीक्षा में एक पूल में बैठे हैं। उनके पास कोई राज्य नहीं है और उन्हें पता नहीं है कि उनका आविष्कार कौन कर रहा है। वे सिर्फ कार्य निष्पादित करते हैं। – jahroy

उत्तर

8

आपको एक स्टेटलेस सत्र बीन से एक स्टेटस सत्र बीन नहीं कॉल करना चाहिए। JEE6 Tutorial - Session Beans

स्टेटलेस सेम अपने सत्र के बारे में कुछ नहीं जानता:

यहाँ कुछ पढ़ने है। जब भी आप इसे कॉल करते हैं, यह स्टेटलेस है। फिर यह एक राज्य सत्र सत्र बीन कहते हैं। कोई आश्चर्य नहीं कि इसमें ग्राहक के सत्र की स्थिति से संबंधित कोई संदर्भ नहीं है क्योंकि इसे स्टेटलेस ऑब्जेक्ट से कहा जाता है।

मुझे नहीं पता कि यह काम करेगा या नहीं, लेकिन संभवतः आप @EJB नोटेशन का उपयोग करके DI की बजाय JNDI लुकअप करके संदर्भ प्राप्त करने का प्रयास कर सकते हैं। स्टेटलेस ईजेबी में ऐसा कुछ काम कर सकता है। आपको शायद इसके साथ खेलना होगा और मैं कुछ भी गारंटी नहीं दे सकता। इसे स्टेटलेस ईजेबी को कॉल करने वाले क्लाइंट का संदर्भ प्राप्त करना चाहिए। ग्राहक को सत्र संदर्भ/दायरा होना चाहिए या इसे भूलना होगा।

@Resource SessionContext sessionContext; 

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

यह है कि एक सत्र दायरे है एक ग्राहक से या किसी अन्य स्टेटफुल EJB से स्टेटफुल सत्र सेम कॉल करने के लिए बेहतर है। स्टेटलेस और स्टेटफुल के पास होने के अलग-अलग कारण हैं।

+0

आपके उत्तर के लिए धन्यवाद। लेकिन यह मेरे लिए काम नहीं करता है ... एसएफएसबी के पास अभी भी कोई सत्र संदर्भ नहीं है। कोई अन्य विचार? – salocinx

+0

सत्र कॉन्टेक्स्ट का उपयोग करने के लिए बस पहले एक सुरक्षा क्षेत्र को सफलतापूर्वक प्रमाणित करना होगा। – salocinx

0

आप लुक-अप से राज्यविहीन सेम अंदर स्टेटफुल सत्र सेम इंजेक्षन तो भी काम नहीं करता है, क्योंकि नया उदाहरण स्टेटफुल सेम के लिए बनाया जाएगा तो यह लॉग इन उपयोगकर्ता जानकारी और आदि की तरह किसी भी मान नहीं रखता है ...

4

आपको एक स्टेटलेस ईजेबी को स्टेटलेस ईजेबी में इंजेक्ट नहीं करना चाहिए। इसमें बहुत अप्रत्याशित परिणाम हो सकते हैं, क्योंकि एक राज्यगत ईजेबी का जीवन चक्र शुरू किया जाता है जब बीन के मालिक द्वारा इंजेक्शन और प्रबंधित किया जाता है। सबसे बुरे मामले में, अलग-अलग उपयोगकर्ताओं के लिए स्टेटस सर्वर द्वारा स्टेटलेस ईजेबी का पुन: उपयोग किया जा सकता है, जो तब उसी स्टेटफुल ईजेबी तक पहुंच जाएगा। आपके मामले में, उपयोगकर्ता को एक अलग उपयोगकर्ता के रूप में पहचाना जाएगा।

शायद आप वर्तमान HTTP सत्र के साथ एक राज्यव्यापी ईजेबी को जोड़ना चाहते हैं, जो कई लोगों को लगता है कि स्वचालित रूप से नहीं किया जाता है। अधिक जानकारी के लिए पढ़ने के अनुभाग नामित EJB 3 यहाँ प्रासंगिक नहीं है: Contexts and Dependency Injection article

आदेश सत्र के साथ स्टेटफुल EJB संबद्ध करने के लिए, आप सत्र में स्टेटफुल EJB इंजेक्षन करने की जरूरत है scoped CDI सेम, जो एक राज्यविहीन सेम में स्वतंत्र रूप से इंजेक्ट किया जा सकता - वास्तव में केवल एक स्टब इंजेक्शन दिया जाता है और सत्र स्कोप्ड बीन (राज्यव्यापी ईजेबी के साथ) हर नए सत्र के लिए बनाया जाता है।

शायद राज्य के बीन के इंटरफ़ेस को निकालने के लिए बेहतर तरीका है, और एक सीडीआई निर्माता का उपयोग करें जो सैटफुल बीन के सत्र स्कोप्ड कार्यान्वयन को तैयार करता है। इस तरह आप मामले को भी संभाल सकते हैं, जब एक राज्यव्यापी ईजेबी स्वचालित रूप से ईजेबी में अपवाद पर हटा दिया जाता है। ऐसे मामले में, आप उसी सत्र में ईजेबी को फिर से बनाना चाहते हैं।