java - EJB interceptors are not called when using generic interfaces -


निम्न कोड को देखते हुए

  सार्वजनिक इंटरफ़ेस फ़ू & lt; T & gt; {टी प्राप्त (); } @Remote सार्वजनिक इंटरफ़ेस बार Foo & lt; String & gt; {} @ स्टैटलेस पब्लिक क्लास बारआईएमपीएल लागू बार {@Interceptors (ExceptionInterceptor.class) सार्वजनिक स्ट्रिंग प्राप्त करें () {नया रनटाइम एक्सपैशन ("लागू नहीं किया गया"); }} पब्लिक क्लास अपवाद इंटरसेप्टर {@AroundInvoke सार्वजनिक वस्तु कन्वर्ट एक्सक्शंसफ़ोअरएक्सनेट सिस्टम (InvocationContext ctx) रनटाइम अपवाद, फेंकता है {try {return ctx.proceed (); } कैच (थ्रोएबल ई) {यदि (ई इंस्टेंसऑफ त्रुटि) नए त्रुटि ("चेंज्ड") फेंकते हैं; नए रनटाइम अपेशन ("बदले गए") को फेंक दें; }}}   

जब हम रिमोट पर एक विधि कॉल करते हैं,

  बार बार = संदर्भ। Lookup (Bar.class.getName ()); bar.get ();   

या

  फु फू = संदर्भ। लुकअप (Bar.class.getName ()); foo.get ();   

इंटरसेप्टर को नहीं कहा जाता है (ग्लासफ़िश 3.0.1 का उपयोग करके)।

समस्या यह है कि इंटरफ़ेस के लिए संकलित वर्ग फ़ाइल < / P>

  javap Foo "Foo.java" से सार्वजनिक इंटरफ़ेस Foo {सार्वजनिक सार java.lang.Object get (); }   

जबकि BarImpl के लिए यह है

  javap BarImpl "BarImpl.java" सार्वजनिक वर्ग से संकलित BarImpl java.lang.Object को लागू करता है बार {सार्वजनिक BarImpl (); सार्वजनिक java.lang.String () प्राप्त करें; सार्वजनिक java.lang.Object get (); }   

तो, जब हम कॉल करते हैं

  बार बार = ...; bar.get ();   

आंतरिक रूप से विधि

  सार्वजनिक java.lang.Object get ();   

को कहा जाता है, जो

  सार्वजनिक java.lang.String को प्राप्त होगा ();   

इंटरसेप्टर केवल आवेदक लगते हैं, जब बाद वाले को सीधे कहा जाता है जब मैं इंटरफ़ेस बार को

  @Remote पब्लिक इंटरफ़ेस बार बदलता है तो फ़ू & lt; String & gt; {@ ओवरराइड स्ट्रिंग प्राप्त (); }   

इंटरसेप्टर को पहली कॉल (bar.get ()) में बुलाया जाता है, लेकिन दूसरे कॉल में नहीं (foo.get ())। क्लास स्तर पर इंटरसेप्टर को परिभाषित करने से प्रॉप्लम ठीक हो सकता है, लेकिन यह हमारे मामले में एक विकल्प नहीं है।

हम कुछ गलत करते हैं, या यह जावा-एई -6 की एक सामान्य समस्या है, या यह ग्लासफिश में एक बग? क्या आसपास कोई काम है? या हमें अपनी सेवाओं में जेनेरिक का उपयोग बिल्कुल भी छोड़ देना चाहिए?

चूंकि हम जावा के साथ काम कर रहे हैं, टाइप करें रनटाइम के दौरान मिट जाता है और आपके व्यावसायिक इंटरफ़ेस में केवल शामिल होंगे:

  सार्वजनिक ऑब्जेक्ट प्राप्त ();   

आप इंटरफ़ेस को बार पर कास्ट कर रहे हैं और यह ठीक है (कोई रनटाइम क्लास अपवाद नहीं है), लेकिन व्यापार विधि जिसे बुलाया जा रहा है वह व्यापार इंटरफ़ेस में मौजूद है (जैसा कि ग्राहक के बारे में केवल एक ही तरीका है): ऑब्जेक्ट मिल () संस्करण।

इसके अलावा, जब से, डिज़ाईन के द्वारा, केवल व्यावसायिक तरीके से इनवोकेशन को रोक दिया जाता है, ऑब्जेक्ट मिल () पर डेलिगेट स्ट्रिंग मिल () इंटरसेप्टेड नहीं होता है (यह सिर्फ एक विधि है जिसे एक और विधि कहते हैं)। इसका अर्थ यह है कि, आपके प्रारंभिक परिदृश्य में, आप एक ऐसी विधि को रोकना चाहते हैं जो व्यापार इंटरफ़ेस से संबंधित नहीं है और इस प्रकार कभी भी अंतःस्थापित नहीं किया जा सकता।

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

Comments