@EJB في JBoss 5.1.0 GA؟
-
17-09-2020 - |
سؤال
لقد كنت أكافح من أجل هذا لفترة من الوقت الآن.
أحاول الاستعداد لـ EJB 3.0.أنا أستخدم JBoss 5.1.0 GA كخادم التطبيقات الخاص بي.لقد بدأت باستخدام حبة جلسة بسيطة للغاية عديمة الحالة مع واجهة محلية وعميل jsp-servlet بسيط يستدعي طريقة حبة الجلسة.كل هذا بينما كنت أحاول استخدامه @EJB
تعليق توضيحي لإدخال حبة الجلسة في فئة servlet.
public class SampleServlet extends HttpServlet {
@EJB
private PersonLocal person;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("In servlet");
response.getWriter().write("Person Name : "+person.getName());
System.out.println(person.getName());
}
}
أنا أستخدم JBoss 5.1.0 GA مع تقصير إعدادات.(لقد حاولت أيضًا مع الجميع إعدادات)
ومع ذلك، اعتدت أن أحصل على إشارة فارغة إلى حقنة فول الجلسة.بعد كفاح لمدة يوم أو نحو ذلك، قمت أخيرًا بتجربة طريقة البحث القبيحة EJB 2.x JNDI بدلاً من @EJB
تعليق توضيحي مع تكوين jndi المحدد في ملف jndi.properties
الملف ويعمل دون أي تغييرات أخرى!
الآن، حاولت معرفة ما إذا كان JBoss 5.1.0 GA يدعم أو لا يدعم الحقن في مستندات JBoss @EJB
تعليق توضيحي، لكن لم أتمكن من العثور على إجابة محددة.فهل يمكن لأحد أن يقول لي ما إذا كان الأمر كذلك؟لأنني أفضل حقًا التعليق التوضيحي على بحث JNDI (أعني من لن يفعل ذلك؟).هل فاتني شيء..؟
ربما كان ينبغي وضع هذا في منتديات JBoss، ولكن..أنا مدمن على هذا المكان ;-)
المحلول
يتم دعم هذا بالتأكيد بواسطة JBoss 5.x نظرًا لأنه معتمد من Java EE 5.
في الواقع، أقترح التحقق من الفصل 11.مقدمة لحقن EJB في Servlets التابع دروس JBoss EJB3, ، يصفون مثالًا تفصيليًا وخطوة بخطوة.
وانتبه بشكل خاص إلى الملاحظة التالية:
لكي يتم إجراء الحقن في وحدة الويب ، يجب على web.xml استخدام الإصدار 2.5 من تطبيق الويب XSD:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
نصائح أخرى
واجهت مشكلة مماثلة في استخدام وحدة جافا للأعمال عن بعد، ولكن لم يكن ذلك بسبب إصدار تطبيق الويب، بل بسبب الطريقة التي كان عميلي يبحث بها عن وحدة جافا للأعمال.
إليك ما نجح بالنسبة لي:
//bean
@Stateless(name="xxxxService")
@Remote(xxxxRemote.class)
public class xxxxService implements xxxxRemote {
//interface - note that no annnotation is required
public interface xxxxRemote {
//in the client
@EJB(mappedName="myJndiNameForxxxx") //for a local ejb, you could use 'beanName='
private xxxxRemote xxxx;
بالنسبة لمشروعي (الذي تم إنشاؤه باستخدام Maven)، يكون العميل موجودًا في تطبيق ويب، ويكون EJB موجودًا في مشروع EJB والذي يتم تغليفه بعد ذلك في مشروع EAR.يتم تعيين JNDI في ملف jboss.xml، الموجود في مشروع EJB (في مشروعي، src/main/resources/META-INF)، ويبدو كما يلي:
<?xml version="1.0" encoding="UTF-8"?>
<jboss xmlns:xs="http://www.jboss.org/j2ee/schema"
xs:schemaLocation="http://www.jboss.org/j2ee/schema/jboss_5_0.xsd"
version="5.0">
<enterprise-beans>
<session>
<ejb-name>xxxxService</ejb-name>
<jndi-name>myJndiNameForxxxx</jndi-name>
</session>
</enterprise-beans>
</jboss>
هذا كل ما يتطلبه الأمر، والآن يمكنني الوصول إلى وحدة جافا للأعمال (EJB) من العميل.أمل أن هذا يساعد شخصاما.
إذا كنت لا تزال تواجه مشكلات، فيمكنك البحث في وحدة تحكم JMX للتأكد من ظهور إدخال JNDI.انظر ضمن "jboss">"service=JNDIview">"list" وانقر على زر "استدعاء".إذا تم نشر الخدمة الخاصة بك بشكل صحيح، فيجب أن ترى اسم JNDI (في المثال الخاص بي، myJndiNameForxxxx) ضمن "ProxyFactory".