"غير قادر على تحويل EJBREF لـ EJB" على حقن CDI (Weld) من @STATLOSIN

StackOverflow https://stackoverflow.com/questions/3509255

سؤال

[تحديث: بعد مناقشة حول منتديات Glassfish/مل في http://forums.java.net/jive/thread.jspa؟messageid=480532 تم رفع خطأ ضد الأسماك الزجاجية https://glassfish.dev.java.net/issues/show_bug.cgi؟id=13040 لهذه القضية.

أحاول ضخ عرض محلي بدون واجهة لـ @stateless eJB في jsf2named @javax.enterprise.context.sessionscoped Backing Bean. EJB هي واحدة من العديد منها تمتد فئة قاعدة عامة مجردة. فشل حقن "@inject youjbclass varname" مع "غير قادر على تحويل eJBREF لـ ejb theejbclass إلى كائن عمل من النوع my.package.name.theabstractbase". تحرير: في الواقع ، اتضح أن الحقن ينجح ، لكن دقة الطريقة في الوكيل المحقن للطرق الموروثة من الفئات الفائقة يفشل. إذا استخدمت "ejb theejbclass varname" ، فسيظل varname فارغًا ، أي لا يتم حقنه.

تفاصيل:

أقوم بتشغيل Glassfish 3.0.1 على Linux (Ubuntu 10.04 في حالة أهمية) وأواجه مشاكل حقيقية معالجة حقن نموذج البيانات الخاص بي في نماذج Scoped Scrop في جلسة JSF2 الخاصة بي باستخدام CDI (WELD). ونعم ، قبل أن تسأل ، لدي beans.xml في مكانه و CDI تنشط لأداء الحقن.

إذا قمت بحقنها بشرح ejb ، على سبيل المثال:

@EJB TheEJBClass memberName;

... لم يتم حقن EJB فعليًا ، تاركًا LegningName Null.

إذا قمت بحقنها باستخدام شرح CDI @inject:

@Inject TheEJBClass memberName;

... ثم يشتكي CDI عندما أسمي طريقة "MemberName" التي تم تنفيذها في فئة فائقة لكبليكليك ولا تتغلب على نفسك ، وتقارير: الإبلاغ:

java.lang.IllegalStateException: Unable to convert ejbRef for ejb TheEJBClass to a business object of type class my.package.name.TheAbstractBase
    at
com.sun.ejb.containers.EjbContainerServicesImpl.getBusinessObject(EjbContainerServicesImpl.java:104)
at
org.glassfish.weld.ejb.SessionObjectReferenceImpl.getBusinessObject(SessionObjectReferenceImpl.java:60)
....

لقد حاولت تحويل القاعدة إلى فئة ملموسة وإلغاء توليدها ، لكنني واجهت نفس المشكلة ، لذلك لا أعتقد أنني أصطدم بقس اللحام مع قواعد عامة (https://jira.jboss.org/browse/weld-305, https://jira.jboss.org/browse/weld-381, https://jira.jboss.org/browse/weld-518).

الخطوط العريضة للرمز ، مع تأهيل الحزمة الكامل على التعليقات التوضيحية المضافة للوضوح ، هو:

// JSF2 managed backing bean.
//
// Called via #{someJSF2Model.value} in a JSF2 page
//
@javax.inject.Named
@javax.enterprise.context.SessionScoped
public class SomeJSF2Model implements Serializable {
   @javax.inject.Inject TheEJBClass member;

   public Integer getValue() {
       return member.getValue();
   }
   // blah blah
}

// One of several EJB classes that extend TheAbstractBase
@javax.ejb.Stateless
public class TheEJBClass extends TheAbstractBase {
  // blah blah
  // does **NOT** override "getValue()"
}

public abstract class TheAbstractBase {
    // blah blah
    public Integer getValue() {
        return 1;
    }
}

لاحظ أن الحقن يفعل اعمل إذا قمت بالتغلب على theabstractbase.getValue () في youjbclass ، أو إذا سمحت طريقة محددة في اليجبيكليز وليس أي فئة فائقة. يبدو أن القضية علاقة بالميراث.

تم عمل الكود المشابه جدًا الذي استخدم ميزات دورة الحياة المدمجة في JSF2 والحقن ، ولكن بالنظر إلى أن هذا مشروع جديد وأن CDI هو المكان الذي تتجه إليه الأمور في المستقبل ، اعتقدت أنه من الأفضل محاولة الذهاب إلى CDI. إليك ما بدأت باستخدام حقن JSF2/EJB ، الذي نجح:

// JSF2 managed backing bean. Using @ManagedBean and JSF2's @SessionScoped
// instead of CDI @Named and CDI @SessionScoped this time.
//
@javax.faces.bean.ManagedBean
@javax.faces.bean.SessionScoped
public class SomeJSF2Model implements Serializable {
   @javax.ejb.EJB TheEJBClass member;
   public Integer getValue() {
       return member.getValue();
   }
   // blah blah
}

// One of several EJB classes that extend TheAbstractBase
// Unchanged from CDI version
@javax.ejb.Stateless
public class TheEJBClass extends TheAbstractBase {
  // blah blah
  // does **NOT** override "getValue()"
}

// Unchanged from CDI version
public abstract class TheAbstractBase {
    // blah blah
    public Integer getValue() {
        return 1;
    }
}

أنا أعمل حاليًا على تجميع حالة اختبار قائمة بذاتها ، لكنني اعتقدت أنني سأطلق النار الآن على السؤال الآن في حال كان هذا شيئًا ما أقوم به شيئًا سخيفًا أو أن هناك حلًا معروفًا جيدًا حتى إيجاد. لماذا عملت مع حقن JSF2/EJB ، ولكن تفشل مع حقن CDI؟

(منذ إعادة نشرها على منتديات Glassfish http://forums.java.net/jive/thread.jspa؟threadid=152567 )

هل كانت مفيدة؟

المحلول

كما هو مذكور أعلاه ، إنه حشرة اللحام/الأسماك الزجاجية.

إصلاح: التخلي عن الأسماك الزجاجية والانتقال إلى JBoss AS 7 ، والذي يعمل بالفعل معظم الوقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top