بحاجة إلى مساعدة في فهم JNDI و classcastexception معينة في J2EE
-
23-09-2019 - |
سؤال
لدي تطبيق Enterprise A و B تم نشره (في WLS 10.0). A هو "الإطار" ، B هو تطبيق عميل. يصدر العميل المكالمات التالية:
Object o = ctx.lookup(jndiName); // line 1
cf = (ConnectionFactory) o; // line 2
ConnectionFactory هي واجهة ، تُعرّف بأنها:
public interface ConnectionFactory
extends java.io.Serializable, javax.resource.Referenceable {
...
}
ما يحدث هو:
- إذا كانت الجرة التي تحتوي على فئة الواجهة موجودة على ClassPath ، يتم تنفيذ السطر 2 بشكل جيد
- إذا لم تكن فئة الواجهة موجودة على ClassPath ، ولكن تم تعبئتها بالتطبيقات بشكل منفصل ، فإن السطر 2 يلقي classcastexception (الذي يحتوي على نص مفيد بأن O هو اتصال FactoryImpl)
لماذا هذا ممكن؟ أفترض أن بحث JNDI يعيد فقط كعبًا إلى الكائن البعيد (هل أنا على صواب في هذه النقطة؟) ، فلماذا يهم إذا كان جهاز تحميل الفئة من فئة الواجهة مختلفًا؟
نوع الإجابة التي أتوقعها:
- نعم ، يجب أن يحدث هذا بالطريقة التي تجربها ، لأن ...
- لا ، لا ينبغي أن يحدث بهذه الطريقة ، لأنه إذا ... ثم ... ، هناك شيء مريب في الإعداد الخاص بك
- الموقف الذي وصفته غريب جدًا ، هل أنت متأكد من أنك لا تفوت نقطة ما في مكان ما؟
- ... :)
سيكون من الرائع أيضًا أن يوضح شخص ما كيف يعمل JNDI و Stubs ، أين يحدث الصب (على جانب العميل على كعب الكبير؟ أو على الكائن الأصلي على الجانب البعيد؟) ، إلخ.
شكرا لمساعدتك!
المحلول
الجواب ، للأسف ، هو (1).
JNDI لا تملي آلية لكيفية تخزين الكائن على الشجرة ، أو كيف يتم تسليمه للعملاء. إنها مجرد واجهة برمجة تطبيقات لاستخدامها لأداء العمليات.
إذا كان كلا التطبيقين في نفس JVM ، كما هو الحال هنا ، فمن المحتمل جدًا أن تقوم WebLogic بتسليم الكائن مباشرة إلى تطبيق العميل. لا يوجد كعب ، و "الجانب البعيد". نظرًا لأن الأنواع التي ينفذها هذا الكائن غير مرئي لتطبيق العميل (تذكر ، يتم تعريف هوية النوع بواسطة اسم الفئة ، وأيضًا محمل Classed الذي تم تحميله منه).
قد تعتقد أن هذا أمر غريب أن يحدث ، لكن ضع في اعتبارك أن التطبيقات التي تتحدث فيما بينها مثل هذا ليست هي القاعدة في تطوير Javaee - من المفترض أن تكون التطبيقات معزولة عن بعضها البعض ، حيث تتقاسم الموارد على مستوى النظام فقط.