inyección “No se puede convertir ejbRef para EJB” en la CDI (Weld) de @Stateless EJB en @SessionScoped JSF2 frijol en Glassfish

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

Pregunta

[ Actualizar : Después de la discusión en los foros Glassfish / ml a http://forums.java.net/jive/thread.jspa?messageID=480532 una de fallo en Glassfish https://glassfish.dev.java.net/issues/show_bug.cgi?id=13040 para este problema.]

Estoy tratando de inyectar una vista sin interfaz local de un @Stateless EJB en un bean de respaldo JSF2 @Named @ javax.enterprise.context.SessionScoped. El EJB es uno de varios que se extiende una clase base genérica. La inyección de "@Inject TheEJBClass varName" falla con "No se puede convertir ejbRef para EJB TheEJBClass a un objeto de negocio de my.package.name.TheAbstractBase clase de tipo". [editar:. En realidad, resulta que la inyección tiene éxito, pero la resolución de métodos en el proxy inyectada para los métodos heredados de superclases falla] Si utilizo "@EJB TheEJBClass varName", entonces varName sigue siendo nula, es decir, nada se inyecta.

detalles:

Estoy corriendo Glassfish 3.0.1 en Linux (Ubuntu 10.04 en caso de que importa) y que tienen verdaderos problemas de manejo de la inyección de mis EJB modelo de datos en mi sesión JSF2 modelos usando CDI (Weld) con ámbito. Y sí, antes de preguntar, tengo beans.xml en su lugar y CDI está activando para realizar la inyección.

Si inyectarla con una anotación @EJB, por ejemplo:

@EJB TheEJBClass memberName;

... el EJB no es en realidad inyecta, dejando sin memberName.

Si me inyecto con una anotación de CDI @Inject:

@Inject TheEJBClass memberName;

... entonces CDI se queja cuando llamo a un método de "memberName" que se implementa en una superclase de TheEJBClass y no se reemplaza en TheEJBClass su auto, la presentación de informes:

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

He intentado convertir la base de clase concreta y de-generifying, pero encontrar el mismo problema, por lo que no creo que estoy golpeando los errores de soldadura con bases genéricas ( https://jira.jboss.org/browse/WELD-305 , https://jira.jboss.org/browse/WELD-381 , https://jira.jboss.org/browse/WELD-518 ).

Un esquema del código, con la calificación paquete completo de anotaciones añadidas para mayor claridad, es la siguiente:

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

Tenga en cuenta que la inyección hace de trabajo si puedo reemplazar TheAbstractBase.getValue () en TheEJBClass, o si llamo a un método definido en TheEJBClass y no una superclase. Parece que el problema es algo que ver con la herencia.

código muy similar que utiliza JSF2 de una función de ciclo de vida y la inyección características trabajó, pero teniendo en cuenta que este es un nuevo proyecto y CDI es donde las cosas van en el futuro, pensé que lo mejor es tratar de ir a por CDI. Esto es lo que empecé a cabo con el uso de JSF2 / inyección EJB, que trabajó:

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

Actualmente estoy trabajando en la elaboración de un caso de prueba en sí misma, pero pensé que iba a disparar la pregunta ahora en caso de que esto es algo en lo que estoy haciendo algo tonto o hay una solución conocida mi Google- fu no es hasta hallazgo. ¿Por qué funcionó con JSF2 / inyección EJB, pero fracasan con la inyección de CDI?

(Desde re-publicado en los foros de Glassfish como http: // foros. java.net/jive/thread.jspa?threadID=152567 )

¿Fue útil?

Solución

Como se señaló anteriormente, se trata de un / glassfish fallo de soldadura.

Fix:. Renunciar a Glassfish y el movimiento para JBoss AS 7, que la mayor parte del tiempo en realidad funciona

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top