2010-07-07 12 views
11

मैं कोड के इस टुकड़े लिखना चाहते हैं:एक स्थिर ईजेबी इंजेक्शन, बकवास?

@Stateless 
public class MyEjb 
{ 
    @EJB 
    private static MyOtherEjbWhichIWantStatic myOtherEjb; 
} 

यह मेरे लिए समझ में आता है, कि मैं विभिन्न कारण के लिए, मेरी कक्षा में एक EJB सुई, एक स्थिर तत्व के रूप में चाहते हैं।

जावा कि दुर्भाग्य से

com.sun.enterprise.container.common.spi.util.InjectionException: Illegal use of static field private static MyOtherEjbWhichIWantStatic myOtherEjb on class that only supports instance-based injection 

मैं इसे नहीं मिलता है साथ बहुत खुश हैं, क्यों मैं एक EJB में एक स्थिर EJB इंजेक्षन नहीं कर सकते हैं नहीं है?

उत्तर

26

के रूप में अन्य लोगों ने बताया, इस विनिर्देशन द्वारा अनुमति नहीं है, और लघु संस्करण है कि @EJB एनोटेशन केवल एक main() समारोह के साथ कक्षाओं में स्थिर सदस्यों के लिए समर्थित है (EJB 3.0 विनिर्देश और एप्लिकेशन ग्राहक कंटेनर दिखाई है)।

ऐसा क्यों है? सबसे पहले, ईजीबी (यह ईजेबी प्रतिबंध का हिस्सा है) में स्थिर फ़ील्ड को पूरी तरह से प्रतिबंधित/लिखने के लिए प्रतिबंधित हैं।Why can't I use nonfinal static fields in my enterprise bean? से

Nonfinal स्थिर वर्ग क्षेत्रों EJBs में अनुमति नहीं दी क्योंकि इस तरह के क्षेत्रों एक उद्यम सेम मुश्किल या असंभव वितरित करने के कर रहे हैं। स्टेटिक क्लास फ़ील्ड्स किसी विशेष वर्ग के सभी उदाहरणों के बीच साझा किए जाते हैं, लेकिन केवल एक ही जावा वर्चुअल मशीन (JVM) के भीतर। एक स्थिर वर्ग क्षेत्र को अद्यतन करना कक्षा के सभी उदाहरणों के बीच क्षेत्र के मूल्य को साझा करने का इरादा दर्शाता है। लेकिन यदि एक वर्ग कई JVMs में एक साथ चल रहा है, तो केवल उन उदाहरणों को अद्यतन करने के उदाहरण के समान JVM में चलने वाले नए मान तक पहुंच होगी। दूसरे शब्दों में, एक जेवीएम में चलने पर एक गैर-स्थैतिक स्थैतिक वर्ग फ़ील्ड अलग-अलग व्यवहार करेगा, इससे कई जेवीएम में चलने की तुलना में। ईजेबी कंटेनर कई JVMs (उसी सर्वर पर चल रहा है, या सर्वर के किसी भी समूह पर) में एंटरप्राइज़ बीन्स वितरित करने का विकल्प सुरक्षित रखता है। गैर-स्थैतिक स्थैतिक वर्ग फ़ील्ड को अस्वीकार कर दिया जाता है क्योंकि एंटरप्राइज़ बीन उदाहरण अलग-अलग व्यवहार करेंगे या नहीं, इस पर निर्भर करते हैं कि वे वितरित किए गए हैं या नहीं।

स्थिर फ़ील्ड फ़ील्ड का उपयोग करने के लिए स्वीकार्य अभ्यास है यदि उन फ़ील्ड को final के रूप में चिह्नित किया गया है। चूंकि अंतिम फ़ील्ड अपडेट नहीं किए जा सकते हैं, एंटरप्राइज़ बीन के उदाहरण कंटेनर द्वारा वितरित किए जा सकते हैं, उन क्षेत्रों के मूल्यों को बिना सिंक्रनाइज़ किए जा रहे हैं।

लेकिन केवल पढ़ने के लिए स्थिर फ़ील्ड का उपयोग करते समय, यह ईजेबी के लिए उपयुक्त नहीं होगा। स्टेटलेस ईजेबी को पूल किया जा सकता है, एक कंटेनर उन्हें नष्ट करने का फैसला कर सकता है (यह कार्यान्वयन विशिष्ट है) और आप कंटेनर को चुनने देना चाहते हैं कि आप किस उदाहरण का उपयोग करने जा रहे हैं, खासकर वितरित वातावरण में। दूसरे शब्दों में, कभी नहीं मान लें कि आप किसी विशेष उदाहरण से बंधे हैं।

तो अंत में, हाँ, यह एक बकवास है।

+0

क्रिस्टल स्पष्ट, धन्यवाद! –

0

स्थिर ईजेबी के जावा ईई 5 विनिर्देश इंजेक्शन से केवल ग्राहक क्लाइंट मुख्य कक्षाओं में ही अनुमति है।

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

1

मैं इसे नहीं मिलता है, यही कारण है कि मैं एक EJB में एक स्थिर EJB इंजेक्षन नहीं कर सकते?

क्योंकि the spec यह अनुमति नहीं देता:

5.2.3Annotations और इंजेक्शन

निम्नलिखित वर्गों, एक क्षेत्र या कुछ कंटेनर से प्रबंधित घटक वर्गों की विधि में वर्णित है को यह अनुरोध करने के लिए एनोटेट किया जा सकता है कि अनुप्रयोग घटक के पर्यावरण से प्रविष्टि इंजेक्शन इंजेक्शन हो ओ कक्षा। [...] एप्लिकेशन क्लाइंट मुख्य कक्षाओं को छोड़कर सभी वर्गों के लिए, फ़ील्ड या विधियां स्थिर नहीं होनी चाहिए।

ध्यान दें कि अपवाद (एप्लिकेशन क्लाइंट मुख्य वर्ग) केवल मौजूद है क्योंकि उन वर्गों को कभी भी तत्काल नहीं किया जाता है। असल में, स्थैतिक क्षेत्र आम तौर पर समस्याग्रस्त होते हैं, और एक अनुप्रयोग सर्वर में दोगुना है, क्योंकि वे अनुरोधों को अलग करने के थ्रेड और लेन-देन को अलग कर सकते हैं, जो पहले स्थान पर किसी एप्लिकेशन सर्वर का उपयोग करने का पूरा बिंदु हैं।

संबंधित मुद्दे