„Kann nicht ejbRef für EJB umwandeln“ auf CDI (Weld) Injektion von @Stateless EJB in @SessionScoped JSF2 bean in Glasfischen

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

Frage

[ UPDATE : Nach der Diskussion über die Glassfish-Foren / ML auf http://forums.java.net/jive/thread.jspa?messageID=480532 ein Fehler wurde gegen Glassfish eingereicht https://glassfish.dev.java.net/issues/show_bug.cgi?id=13040 für dieses Problem.]

Ich versuche, eine lokale nicht-Schnittstelle Ansicht eines @Stateless EJB in ein JSF2 @Named @ javax.enterprise.context.SessionScoped Backing Bean zu injizieren. Die EJB ist eine von mehreren, die eine abstrakte generische Basisklasse erweitern. Die Injektion von „@Inject TheEJBClass varName“ nicht mit „Kann nicht ejbRef für ejb TheEJBClass zu einem Business-Objekt vom Typ Klasse my.package.name.TheAbstractBase konvertieren“. [edit:. Eigentlich ist es stellt sich heraus, dass die Injektion erfolgreich, aber Verfahren Auflösung in der injizierten Proxy für Methoden von Oberklassen geerbt versagt] Wenn ich „@EJB TheEJBClass varName“ verwenden, dann bleibt varName null, das heißt nichts injiziert wird.

Details:

Ich bin mit Glassfish 3.0.1 auf Linux (Ubuntu 10.04, falls es wichtig ist) und reale Probleme mit meinen Daten Injektion von EJBs Modell in meine JSF2 Session Handling scoped Modelle mit CDI (Weld). Und ja, bevor Sie fragen, ich habe beans.xml an ihrem Platz und CDI wird aktiviert Injektion durchzuführen.

Wenn ich injizieren sie mit einer @EJB Anmerkung, zum Beispiel:

@EJB TheEJBClass memberName;

... ist die EJB nicht tatsächlich injiziert, member null zu verlassen.

Wenn ich spritze es mit einer CDI @Inject Anmerkung:

@Inject TheEJBClass memberName;

... dann klagt CDI, wenn ich eine Methode des „Mitgliedsname“ nennen, die in einer übergeordneten Klasse von TheEJBClass implementiert ist und nicht außer Kraft gesetzt in TheEJBClass seine selbst, die Berichterstattung:

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)
....

Ich habe versucht, die Basis zu konkreter Klasse Umwandlung und de-generifying, aber das gleiche Problem auftreten soll, so glaube ich nicht, daß ich die Weld Bugs mit generischen Basen schlagen ( https://jira.jboss.org/browse/WELD-305 , https://jira.jboss.org/browse/WELD-381 , https://jira.jboss.org/browse/WELD-518 ).

Ein Entwurf des Codes, mit vollem Paket Qualifikation auf Anmerkungen zur Klarheit hinzugefügt wird:

// 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;
    }
}

Beachten Sie, dass die Injektion hat Arbeit, wenn ich außer Kraft setzen TheAbstractBase.getValue () in TheEJBClass, oder wenn ich nenne ein Verfahren definiert in TheEJBClass und keine übergeordneten Klasse. Es scheint, wie das Problem etwas mit Vererbung zu tun ist.

Sehr ähnlich Code dass JSF2-interner Lebenszyklus verwendet und Injektion Funktionen gearbeitet, aber wenn man bedenkt, dass dies ein neues Projekt ist und CDI ist, wo die Dinge in Zukunft zusteuern, dachte ich es am besten zu versuchen, für CDI zu gehen. Hier ist, was ich begann mit der Verwendung von JSF2 / EJB-Injektion, die gearbeitet:

// 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;
    }
}

Im Moment arbeite ich auf die Zusammenstellung eines in sich geschlossenen Testfall, dachte aber, ich die Frage jetzt im Fall abfeuern würde dies ist etwas, wo ich nur dumm, etwas zu tun oder es ist eine wohlbekannte Lösung mein Google- fu ist nicht bis zu Erkenntnis. Warum hat es funktioniert mit JSF2 / EJB-Injektion, aber mit CDI Injektion versagen?

(Seit Wieder geschrieben auf den Glassfish-Foren als http: // Foren. java.net/jive/thread.jspa?threadID=152567 )

War es hilfreich?

Lösung

Wie oben erwähnt, ist es ein Weld / Glasfischen Fehler.

Fix:. Gib auf Glassfish und Umzug in JBoss AS 7, die eigentlich die meiste Zeit funktioniert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top