Pergunta

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

Se não for, tenho que procurar o feijão no JNDI, pois sei que você não pode usar simples a nova palavra -chave.

Foi útil?

Solução

Sim, use a pesquisa JNDI.

Como seu Pojo é criado por você (presumo), o contêiner não é responsável por injetar as dependências.

Outras dicas

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

A injeção de EJB em um pojo é possível E SE Você usa o JSR-299 (Java COntexts e DEPENDÊNCIA EUnejeção), ou seja, se o seu pojo é um feijão gerenciado pelo CDI. Nesse caso, você pode fazer:

@Inject MyEJB service

Mas esse não é um recurso 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) adiciona a capacidade de especificar nomes JNDI globais para EJBS. Isso significa que você pode usá -los em qualquer feijão, em qualquer lugar.

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

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

Finalmente, o Java EE 6, com a inclusão do JSR-299, pode permitir que o que você descreva aconteça de alguma forma; Ainda não conheço a especificação, então não posso comentar sobre isso.

Espero que tudo ajude.

Eu também me pergunto se eu pudesse injetar EJBs em objetos não gerenciados. Veja o Soldar (Implementação de referência JSR 299) Documentação para obter mais detalhes.

Mas você pode realizar injeção de dependência manualmente dentro de um repositório ou fábrica como esta:

@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ê tiver muitos métodos em que a injeção deve ser realizada, poderá usar um interceptador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top