Quando injetar beans EJB 3.1 no POJO criado por @Inject, a injeção funciona. Quando eu construo POJO sozinho, então não (Glassfish v3). É um comportamento correto?
Minhas aulas (no módulo EJB):
@Singleton @LocalBean @Startup @Named public class NewSingletonBean { @PostConstruct public void init(){ System.out.println("NewSingletonBean INIT"); } }
_
public class MyPOJO { @Inject NewSingletonBean newSingletonBean; public void sth(){ System.out.println("EJB injected into POJO: " + (newSingletonBean != null)); } }
Isso não funciona :
@Singleton @LocalBean @Startup @DependsOn(value="NewSingletonBean") public class NewSingletonBean2 { @Inject NewSingletonBean newSingletonBean; @PostConstruct public void init(){ System.out.println("NewSingletonBean2 INIT"); System.out.println("EJB injected into EJB: " + (newSingletonBean != null)); MyPOJO p = new MyPOJO(); p.sth(); } }
_
E isso funciona bem :
@Singleton @LocalBean @Startup @DependsOn(value="NewSingletonBean") public class NewSingletonBean2 { @Inject NewSingletonBean newSingletonBean; @Inject MyPOJO p; @PostConstruct public void init(){ System.out.println("NewSingletonBean2 INIT"); System.out.println("EJB injected into EJB: " + (newSingletonBean != null)); p.sth(); } }
Estou usando o NetBeans 7.0.1.
estrutura de diretórios dist:
│ CDITest.ear │ └───gfdeploy └───CDITest ├───CDITest-ejb_jar │ │ .netbeans_automatic_build │ │ .netbeans_update_resources │ │ │ ├───META-INF │ │ beans.xml │ │ MANIFEST.MF │ │ │ └───tries │ MyPOJO.class │ NewSingletonBean.class │ NewSingletonBean2.class │ ├───CDITest-war_war │ │ index.jsp │ │ │ ├───META-INF │ │ MANIFEST.MF │ │ │ └───WEB-INF │ └───classs │ .netbeans_automatic_build │ .netbeans_update_resources │ └───META-INF MANIFEST.MF
Estrutura EAR desembalada:
│ CDITest-ejb.jar │ CDITest-war.war │ └───META-INF MANIFEST.MF
Estrutura do jar de módulo EJB descompactado:
├───META-INF │ beans.xml │ MANIFEST.MF │ └───tries MyPOJO.class NewSingletonBean.class NewSingletonBean2.class
É um comportamento correto?
A parte seguinte pode ser uma resposta para sua pergunta:
De acordo com a especificação do CDI 1.0 :
3.7. Construtores de feijão
Quando o contêiner instancia uma class de bean, ele chama o construtor de bean . O construtor de bean é um construtor da class de bean.
O aplicativo pode chamar construtores de bean diretamente. No entanto, se o aplicativo diretamente instanciar o bean , nenhum parâmetro será passado para o construtor pelo contêiner; o object retornado não está vinculado a nenhum contexto; nenhuma dependência é injetada pelo contêiner ; e o ciclo de vida da nova instância não é gerenciado pelo contêiner.
HTH!
É um comportamento correto, porque o DI funciona apenas para beans gerenciados por contêineres, e não para aqueles que você criou sozinho.