EJB 3.1 @EJB Injection into POJO

Sendo um idiota completo esta tarde e não consigo encontrar a resposta em qualquer lugar.

Com a nova especificação do EJB 3.1 é possível injetar um EJB em um pojo? Eu sei que no EJB 3.0 a anotação @EJB pode ser usada para injetar um EJB, mas isso não funcionou em pojos simples.

Se não for, tenho que procurar o bean no JNDI, pois sei que não é possível usar a nova palavra-chave.

Desde já, obrigado.

Karl

Sim, use a pesquisa JNDI.

Como o seu POJO é criado por você (suponho), o container não é responsável por injetar as dependencies.

Com a nova especificação do EJB 3.1 é possível injetar um EJB em um pojo? Eu sei que no EJB 3.0 a anotação @EJB pode ser usada para injetar um EJB, mas isso não funcionou em pojos simples.

A injeção de EJB em um POJO é possível se você usar JSR-299 (Java C ntextos e D ependency I njection), ou seja, se seu POJO for um bean gerenciado por CDI. Nesse caso, você poderia fazer:

@Inject MyEJB service 

Mas este não é um recurso do EJB 3.1, isso vem do CDI. E se você não estiver usando o CDI, terá que fazer uma pesquisa.

A nova especificação EJB (3.1) inclui a capacidade de especificar nomes JNDI globais para EJBs. Isso significa que você pode usá-los em qualquer bean, em qualquer lugar.

Você deve fazer uma consulta JNDI explícita, no entanto, como um contêiner EJB 3.1 não saberá sobre seu POJO.

A única exceção, que eu acho que não se aplica a você, é se o seu POJO é realmente um aplicativo cliente, caso em que o campo que deve conter o EJB é estático, você pode aplicar a anotação @EJB a ele. Se essa é a sua situação, você deve verificar as regras do cliente de aplicativo na especificação geral do Java EE 5.

Finalmente, o Java EE 6, com sua inclusão do JSR-299, pode permitir que o que você descreve aconteça de alguma forma; Eu não conheço o spec ainda assim não posso comentar sobre isso.

Espero que tudo isso ajude.

Gostaria de saber se eu poderia injetar EJBs em objects não gerenciados . Consulte a documentação do Weld (JSR 299 reference implementation) para obter mais detalhes.

Mas você pode executar a injeção de dependência manualmente dentro de um repository ou fábrica assim:

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

Se você tem muitos methods onde a injeção deve ser realizada, você pode usar um interceptador.