« Impossible de convertir ejbRef pour EJB » à la CDI (soudure) injection de @Stateless EJB en haricot @SessionScoped JSF2 dans Glassfish

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

Question

[ UPDATE : Après discussion sur les forums Glassfish / ML http://forums.java.net/jive/thread.jspa?messageID=480532 un bug a été déposée contre Glassfish https://glassfish.dev.java.net/issues/show_bug.cgi?id=13040 pour cette question.]

Je suis en train d'injecter une vue sans interface locale d'un @Stateless EJB dans un backing bean @Named JSF2 @ javax.enterprise.context.SessionScoped. L'EJB est l'un de plusieurs qui s'étendent une classe de base générique abstraite. L'injection de « @Inject TheEJBClass nomVar » échoue avec « Impossible de convertir ejbRef pour ejb TheEJBClass à un objet métier de type classe my.package.name.TheAbstractBase ». [edit:. En fait, il se trouve que l'injection réussit, mais la résolution de la méthode dans la procuration injecté des méthodes héritées de superclasses échoue] Si j'utilise « @EJB TheEJBClass nomVar » alors nomVar reste nulle, c.-à-rien est injectée.

Détails:

Je suis en cours d'exécution Glassfish 3.0.1 sur Linux (Ubuntu 10.04 au cas où il importe) et ayant des problèmes réels de traitement par injection de mes EJBs modèle de données dans ma session JSF2 scope modèles utilisant CDI (soudure). Et oui, avant de vous demander, je beans.xml en place et CDI est l'activation d'effectuer l'injection.

Si j'injectent avec une annotation @EJB, par exemple:

@EJB TheEJBClass memberName;

... l'EJB est pas réellement injecté, laissant nulle nom_membre.

Si j'injectent avec une annotation CDI @Inject:

@Inject TheEJBClass memberName;

... puis CDI se plaint quand je l'appelle une méthode de « nomMembre » qui est mis en œuvre dans une superclasse de TheEJBClass et non surchargées dans TheEJBClass son auto, rapports:

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

J'ai essayé de convertir la base en classe et en béton de-generifying, mais rencontrer le même problème, donc je ne pense pas que je suis frappé les bugs de soudure avec des bases génériques ( https://jira.jboss.org/browse/WELD-305 , https://jira.jboss.org/browse/WELD-381 , https://jira.jboss.org/browse/WELD-518 ).

Un aperçu du code, avec la qualification de package complet sur les annotations ajoutées pour plus de clarté, est la suivante:

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

Notez que l'injection fait si je travail Override TheAbstractBase.getValue () dans TheEJBClass, ou si je l'appelle une méthode définie dans TheEJBClass et non une superclasse. Il semble que la question est quelque chose à voir avec l'héritage.

code très similaire utilisé de JSF2 cycle de vie intégré et injection fonctionnalités travaillé, mais étant donné que c'est un nouveau projet et CDI est l'endroit où les choses vont dans l'avenir, je pensais qu'il valait mieux essayer d'aller pour CDI. Voici ce que j'ai commencé avec injection à l'aide JSF2 / EJB, qui a travaillé:

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

Je travaille actuellement Ébaucher un test autonome, mais je pensais que la question de déclencher maintenant dans le cas où c'est quelque chose où je fais juste idiot quelque chose ou il y a une solution bien connue mon Google- fu n'est pas à trouver. Pourquoi a-t-il avec injection JSF2 / EJB, mais ne parviennent pas à l'injection CDI?

(Depuis republié sur les forums Glassfish comme http: // forum. java.net/jive/thread.jspa?threadID=152567 )

Était-ce utile?

La solution

Comme indiqué ci-dessus, il est un bug de soudure / GlassFish.

Correction:. Renoncer à Glassfish et passer à JBoss AS 7, qui fonctionne en fait la plupart du temps

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top