2010-01-07 23 views
13

Siendo un rodaballo completo esta tarde y parece que no puede encontrar la respuesta en ningún lado.EJB 3.1 @EJB Inyección en POJO

Con la nueva especificación EJB 3.1, ¿es posible inyectar un EJB en un pojo? Sé en EJB 3.0 que la anotación @EJB podría usarse para inyectar un EJB pero esto no funcionó en pojos simples.

Si no es así, tengo que buscar el bean en JNDI, ya que sé que no puede usar la palabra clave nueva.

Gracias de antemano.

Karl

+0

¿Estás usando CDI? http://java.sun.com/javaee/6/docs/tutorial/doc/giwhb.html –

Respuesta

19

Sí, use la búsqueda JNDI.

Como su POJO es creado por usted (supongo), el contenedor no es responsable de inyectar las dependencias.

+0

No todas las implementaciones para Java EE 5 permiten la publicación de un @Local Bean en el árbol JNDI. Por lo que recuerdo, es una característica opcional en la especificación. WebLogic 11g no tiene eso en marcha, entonces en ese caso pasamos el recurso inyectado como un argumento de constructor al POJO. – BonanzaOne

7

La nueva especificación EJB (3.1) agrega la capacidad de especificar nombres JNDI globales para EJB. Esto significa que puede usarlos en cualquier bean, en cualquier lugar.

Debe hacer una búsqueda JNDI explícita, sin embargo, como un contenedor EJB 3.1 no sabrá acerca de su POJO.

La única excepción, que supongo que no se aplica a usted, es si su POJO es realmente un cliente de aplicación, en cuyo caso siempre que el campo que contenga el EJB sea estático, puede aplicar el @EJB anotación a ella. Si esa es su situación, debería consultar las reglas del cliente de la aplicación en la especificación general de Java EE 5.

Finalmente, Java EE 6, con su inclusión de JSR-299, puede permitir que lo que describa suceda de alguna manera; Aún no conozco la especificación, así que no puedo comentar sobre ella.

Espero que esto ayude.

+1

Realizar una búsqueda desde cualquier lugar ya era posible con versiones anteriores de Java EE (incluso J2EE). EJB 3.1 no cambia eso. Lo nuevo en Java EE 6 es que puedes convertir cualquier cosa en un frijol administrado usando CDI y también beneficiarse de la inyección en frijoles CDI. –

+1

Las versiones anteriores de Java EE no especificaban la sintaxis de nombres JNDI global. Tampoco exigieron que un cliente remoto que no era un cliente de aplicaciones pudiera buscar nada en JNDI. –

1

Me pregunto si podría inject EJBs into unmanaged objects. Consulte la documentación Weld (implementación de referencia de JSR 299) para obtener más detalles.

Pero se puede llevar a cabo la inyección de dependencia con la mano dentro de un repositorio o la fábrica de esta manera:

@Stateless 
public PojoRespository { 

    @Inject 
    ResourceForPojos resource; 
    @PersistenceContext 
    private EntityManager em; 

    public Pojo findById(Object id) { 
    Pojo p = (Pojo) em.find(Pojo.class, id); 
    p.setResource(resource); // injects resource 
    return p; 
    } 

} 

Si tiene muchos métodos en los que se debe realizar la inyección, se puede utilizar un interceptor.

28

Con la nueva especificación de EJB 3.1, ¿es posible inyectar un EJB en un pojo? Sé en EJB 3.0 que la anotación @EJB podría usarse para inyectar un EJB pero esto no funcionó en pojos simples.

La inyección de EJB en un POJO es posible SI utiliza JSR-299 (Java C ontexts y D ependency I njection) es decir, si su POJO es un CDI bean gestionado. En ese caso, usted puede hacer:

@Inject MyEJB service 

Pero esto no es una característica de EJB 3.1, esto viene de CDI. Y si no está usando CDI, tendrá que hacer una búsqueda.