2012-01-02 3 views
10

मैं ग्लासफिश 3.1.1 पर EclipseLink उपयोग कर रहा हूँ और मैं इस अपवाद को समझने के लिए कोशिश कर रहा हूँ:javax.ejb.EJBException: कोई इंटरफेस पर अवैध गैर व्यावसायिक विधि का उपयोग दृश्य

javax.ejb.EJBException: Illegal non-business method access on no-interface view 
    at org.mycompany.myproject.session.__EJB31_Generated__MyBeanFacade__Intf____Bean__.getEntityManager(Unknown Source) 
    at org.mycompany.myproject.session.AbstractFacade.edit(AbstractFacade.java:28) 
    at org.mycompany.myproject.controller.EditMyBeanServlet.doPost(EditMyBeanServlet.java:199) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 

सूचना है कि स्टैक ट्रेस इंगित करता है कि समस्या NetStans उत्पन्न StarFacade.getEntityManager विधि में ट्रिगर की गई है।

कोई विचार है कि बिल्ली क्या चल रहा है या समस्या निवारण के लिए कोई सुझाव है? मैं अनुमान लगा रहा हूं कि ईजेबी में लेनदेन या कैशिंग स्थिति अजीब है जब ऐसा होता है क्योंकि कभी-कभी संपादन विधि को कॉल करना ठीक काम करता है। मैं एक सर्वलेट से ईजेबी विधियों को बुला रहा हूँ। एक इकाई में परिवर्तनों को सहेजने का प्रयास करते समय अपवाद होता है।

उत्तर

3

मुझे लगता है कि मुझे तीसरे पक्ष के सॉफ्टवेयर में समाधान और संभवतः एक बग मिल सकता है। ऐसा लगता है जैसे ग्लासफ़िश 3.1.1/ईजेबी 3.1/एक्लिप्ससेंक विधि ओवरलोडिंग को सही तरीके से संभाल नहीं सकता है। मेरे पास मेरे ईजेबी नामक एक विधि को परिभाषित किया गया है जो पैरेंट अमूर्त वर्ग से विधि को अधिभारित करता है (ओवरराइड नहीं करता)। ईजेबी के अमूर्त माता-पिता में संपादन नाम की एक विधि है जो एक सामान्य प्रकार लेती है और फिर मुझे ईजेबी में संपादित नाम का एक तरीका मिला है जो एक सूची लेता है। अगर मैं किसी और चीज का नाम बदलता हूं ताकि यह अब अधिभारित न हो तो अपवाद दूर हो जाता है!

कोड:

public abstract class AbstractFacade<T> { 
protected abstract EntityManager getEntityManager(); 
public void edit(T entity) { 
... 

और

@Stateless 
public class MyEntityFacade extends AbstractFacade<MyEntity> { 
protected EntityManager getEntityManager() { return em;) 
public void edit(List<MyEntity> entities) { 
... 

नोट: मैंने देखा है कि अगर मैं getEntityManager विधि को सार्वजनिक करने के बजाय संरक्षित मैं एक EJBException के बजाय एक TransactionRequiredException मिलेगा।

+0

दूसरे शब्दों में: ऐसा प्रतीत होता है कि EclipseLink किसी EJB – Ryan

+3

में उत्तराधिकारी विधियों को अधिभारित नहीं कर सकता है क्या यह इस समस्या से संबंधित है? http://java.net/jira/browse/GLASSFISH-17235 –

+0

@ piotr-nowicki - बिंगो, मुझे लगता है कि आपको समस्या की एक समस्या रिपोर्ट मिली है। धन्यवाद। मजेदार है कि किसी ने इस जवाब को कम किया! – Ryan

27

आपको जो त्रुटि मिलती है वह आपको इंगित करती है कि आपका कोड संरक्षित विधि को वैसे भी कॉल करने का प्रयास कर रहा है। ईजेबी पर नो-इंटरफेस दृश्यों के लिए इसकी अनुमति नहीं है। आपको केवल सार्वजनिक विधियों को कॉल करने की अनुमति है।

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

लेकिन जैसा कि बताया गया है, ईजेबी नियमों द्वारा इसकी अनुमति नहीं है, और इस प्रकार एक अपवाद फेंक दिया जाता है।

आप यह काम आसानी इंजेक्शन द्वारा एक सेम निम्नलिखित की तरह पुन: पेश कर सकते हैं:

@Stateless 
public class FooBean { 

    public void callMe() { 
    } 

    protected void doNotCallMe() { 
    } 
} 

इस कहीं (एक ही पैकेज में जैसे सर्वलेट) सम्मिलित करें और doNotCallMe() कॉल करने के लिए प्रयास करें। आप एक ही अपवाद देखेंगे। callMe() पर कॉल करें और सब ठीक हो जाएगा।

+0

हां, मैं समझता हूं कि केवल सार्वजनिक विधियां ईजेबी इंटरफ़ेस का हिस्सा हैं। हालांकि मैं वास्तव में सर्वलेट (मेरे उत्तर में प्रदान कोड) से संपादित नाम की एक सार्वजनिक विधि को बुला रहा हूं। ऐसा लगता है कि कुछ ओवरलोडेड विधियों के साथ एक बग है। – Ryan

+1

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

+0

मेरे प्रश्न का उत्तर देने के लिए समय निकालने के लिए धन्यवाद। मुझे लगता है कि आपका जवाब सहायक है (कल इसे ऊपर उठाया गया)। मुझे और कोड प्रदान करना चाहिए था। मुझे लगता है कि आपका जवाब आम तौर पर अपवाद का क्या मतलब है। – Ryan

0

अजीब बात यह है कि मेरे ईजेबी के भीतरी वर्ग के साथ मुझे एक ही समस्या थी। माता-पिता की निजी विधि या इंजेक्शन ईजेबी पर पहुंचने की कोशिश करते समय, मुझे कुछ समस्याएं आईं। मुझे ज्यादातर चीजों पर दृश्यता थी लेकिन आखिरकार एक रनटी, चीजें गलत हो गईं।

अंत में, मैंने जेएनडीआई के माध्यम से अपने मूल वर्ग को पुनः प्राप्त करने का निर्णय लिया, इस प्रकार मैं परेशानियों के बिना सार्वजनिक विधि को कॉल कर सकता था। इस बीच मैं अपने माता-पिता वर्ग पर अभी भी निजी तरीकों को बुला सकता हूं, मुझे अभी भी याद रखना होगा कि यह असफल हो जाएगा।

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