2011-11-17 14 views
9

मैं जावा ईई 6 और सीडीआई में नया हूं। मैंने कुछ ट्यूटोरियल और वेल्ड दस्तावेज पढ़ा है। हालांकि मेरी समझ से काम करने वाला कुछ ऐसा नहीं है, इसलिए मुझे मदद चाहिए।एक ईजेबी की सीडीआई इंजेक्शन की ओर जाता है NullPointerException

मेरे पास निम्न स्थिति है। मैंने आईडीई के साथ आपूर्ति किए गए मेवेन आर्केटाइप का उपयोग करके नेटबीन 7.0.1 के साथ जावा ईई 6 एप्लीकेशन बनाया और आईडीई द्वारा आपूर्ति किए गए ग्लासफ़िश 3.1 पर तैनात किया गया।

beans.xml मेरे ईजेबी जार की मेटा-आईएनएफ निर्देशिका में स्थित है।

मैं अपने EJB कलाकृतियों (और EntityManager) के लिए एक वर्ग है कि एक निर्माता वर्ग के रूप में काम करता है को केवल बनाया है

@Stateless 
public class EjbArtifactProducer { 

    @PersistenceContext(unitName = "trackProfiler-PU")  
    private EntityManager em; 

    @EJB 
    private UserFacadeLocal userFacade; 

    @EJB 
    private AuthServiceLocal authService; 

    @EJB 
    private NewsEntryFacadeLocal newsEntryFacade; 

    @EJB 
    private RoleFacadeLocal roleFacade; 

    @EJB 
    private TrackCommentFacade trackCommentFacade; 

    @EJB 
    private TrackFacade trackFacade; 

    @EJB 
    private TrackTypeFacade trackTypeFacade; 

    @EJB 
    private WaypointFacadeLocal waypointFacade; 

    @Produces 
    public AuthServiceLocal getAuthService() { 
    return authService; 
    } 

    @Produces 
    public EntityManager getEm() { 
    return em; 
    } 

    @Produces 
    public NewsEntryFacadeLocal getNewsEntryFacade() { 
    return newsEntryFacade; 
    } 

    @Produces 
    public RoleFacadeLocal getRoleFacade() { 
    return roleFacade; 
    } 

    @Produces 
    public TrackCommentFacade getTrackCommentFacade() { 
    return trackCommentFacade; 
    } 

    @Produces 
    public TrackFacade getTrackFacade() { 
    return trackFacade; 
    } 

    @Produces 
    public TrackTypeFacade getTrackTypeFacade() { 
    return trackTypeFacade; 
    } 

    @Produces 
    public UserFacadeLocal getUserFacade() { 
    return userFacade; 
    } 

    @Produces 
    public WaypointFacadeLocal getWaypointFacade() { 
    return waypointFacade; 
    }  

} 

मैं @Produces टिप्पणी के रूप में ऊपर दिखाए गए तरीकों पर खेतों एक सीधे लागू करने की कोशिश की।

हालांकि निम्नलिखित एक और EJB

@Inject 
private NewsEntryFacadeLocal newsEntryFacade; 

यह एक राज्यविहीन सत्र EJB में किया जाता है में कुछ भी इंजेक्षन नहीं करता, लेकिन जब मैं अपने व्यापार के तरीकों में से किसी में newsEntryFacade तक पहुँचने का प्रयास एक NullPointerException फेंक दिया है। तो स्पष्ट रूप से कोई इंजेक्शन नहीं हो रहा है या मेरे निर्माता शून्य संदर्भ प्रस्तुत करते हैं।

क्या मुझे कुछ याद आ रही है? या यह काम सीडीआई/वेल्ड के अनुसार होना चाहिए?

अजीब यह जब मैं वेब अनुप्रयोग भाग में EJBs @Inject करने की कोशिश कि जिस तरह से काम करने के लिए लगता है (हालांकि मैं अपने .war इस काम करने के लिए एक अतिरिक्त निर्माता वर्ग की जरूरत है, इस के रूप में यह होना चाहिए है?) ।

संपादित करें: परियोजना एक चींटी निर्माण (नेटबीन द्वारा उत्पन्न) के साथ काम करती है। क्या NetBeans द्वारा प्रदान की गई मेवेन आर्केटाइप के साथ कोई समस्या है? ऐसा लगता है कि मेवेन आर्केटाइप के साथ युद्ध और ईजेबी मॉड्यूल के बीच सीडीआई इंजेक्शन के साथ कुछ मुद्दे हैं। मैंने पाया कि अगर मेरे पास वेब और ईजेबी मॉड्यूल में अलग-अलग उत्पादक थे, तो ग्लासफ़िश एक तैनाती त्रुटि उत्पन्न करता है जिसमें कहा गया है कि इंटरफेस के दो अलग-अलग कार्यान्वयन हैं। लेकिन जब मैं वेब मॉड्यूल में निर्माता को हटा देता हूं वेल्ड शिकायत करता है कि वेब मॉड्यूल में मेरे बीन्स में इंजेक्ट करना चाहते हैं तो ईजेबी को हल नहीं किया जा सकता है। इसके अलावा चींटी बिल्ड ईजेबी को निर्माता के बिना इंजेक्शन किया जा सकता है, जबकि मेवेन बिल्ड को कक्षा में उत्पादक फ़ील्ड की आवश्यकता होती है। मैं यह नहीं समझा सकता कि यह कैसे हो सकता है। सभी अंतिम तैनाती के बराबर बराबर होना चाहिए, है ना?

+0

एक और ईजेबी ने इंजेक्ट करने की कोशिश की, क्या यह वही ईजेबी जार या कोई अन्य संग्रह है? ध्यान दें: बीन-डिस्कवरी (या सीडीआई) को सक्षम करने के लिए beans.xml प्रत्येक तैनाती अभिलेखागार में मौजूद होना चाहिए। .Wars के लिए वेब-आईएनएफ में और मेटा-आईएनएफ में .jars – stratwine

+0

हां। दोनों में beans.xml है। –

+0

मैंने अपनी परियोजना को चींटी निर्माण में बदलने की कोशिश की है। सब कुछ ठीक काम करता है। मुझे अब युद्ध और ईजेबी मॉड्यूल के लिए अलग उत्पादक बनाने की भी आवश्यकता नहीं है। सवाल अब है: क्या मेवेन आर्केटाइप के साथ कोई समस्या है? या क्या विचार करने के लिए कोई विशेष चेतावनी है? –

उत्तर

0

@jamed EjbArtifactProducer में डालने का प्रयास करें। इसके अलावा, अगर उत्पादन इस तरह का सरल है, तो मुझे लगता है कि इसे भी हटाने के लिए बेहतर है (अन्यथा, आपको एक और बदलाव करना चाहिए)।

1

यदि आप @Inject का उपयोग करना चाहते हैं तो इसे @Named @ApplicationScoped के रूप में एनोटेट करें, अन्यथा अपने सिंगलटन इंजेक्शन करते समय @EJB का उपयोग करें।

0

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

1

जॉर्डन डेनिसिस सही है। आप @Inject और ईजेबी की कोशिश कर रहे हैं, लेकिन आप ईजेबी के लिए @EJB का उपयोग कर रहे हैं।आप ईजेबी कक्षा शायद @Stateless या कुछ के साथ एनोटेटेड हैं। @Inject का उपयोग सत्र बीन्स पर किया जाना चाहिए जो @Named और कुछ प्रकार के दायरे से एनोटेटेड हैं।

0

आप दो अलग-अलग अवधारणाओं को मिश्रित कर रहे हैं ... जेएसएफ के लिए बैकिंग बीन्स के रूप में सीडीआई का उपयोग करें। (वेब कंटेनर में सीडीआई) और बिजनेस लेयर में ईजेबी और जेपीए का उपयोग करें ... सीडीआई परत विशिष्ट व्यापार विधि को कॉल करने के लिए ईजेबी इंजेक्ट कर सकती है।

इस मामले में आपके पास चिंताओं पर एक साफ अलगाव है।

बीटीडब्ल्यू: आपको किसी भी ईजेबी इंटरफेस की आवश्यकता नहीं है! यदि आपके पास रिमोट से संवाद करने की आवश्यकता है तो केवल इंटरफ़ेस का उपयोग करें ... (@Remote)। @LocalBean एनोटेशन के साथ आप सीधे ईजेबी को इंजेक्ट कर सकते हैं ..

यदि आपके पास अपनी खुद की चिंता के साथ परतों को अलग-अलग अलगाव है, तो मुझे लगता है कि आपको इस NullPointerException के लिए बेहतर कारण मिल गया है .. और मुझे लगता है कि आपका NullPointerException नहीं है इस के बाद किसी भी अधिक मौजूद है ...

Layering:

वेब ब्राउज़र -> JSF Facelet -> CDI का बैकअप बीन -> EJB सेवा (रों) -> EntityManager

+0

दिलचस्प लिंक -> http://www.adam-bien.com/roller/abien/entry/how_to_deal_with_interfaces – StefanHeimberg

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