当CDI注入POJO应该有效吗? (GlassFish v3)
当我将EJB 3.1 bean注入由@Inject创建的POJO时,注入工作。 当我自己构建POJO时,它不会(Glassfish v3)。 这是正确的行为吗?
我的类(在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)); } }
这不起作用 :
@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(); } }
_
这个工作正常 :
@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(); } }
我正在使用NetBeans 7.0.1。
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 │ └───classes │ .netbeans_automatic_build │ .netbeans_update_resources │ └───META-INF MANIFEST.MF
解包的EAR结构:
│ CDITest-ejb.jar │ CDITest-war.war │ └───META-INF MANIFEST.MF
解压缩的EJB模块jar结构:
├───META-INF │ beans.xml │ MANIFEST.MF │ └───tries MyPOJO.class NewSingletonBean.class NewSingletonBean2.class
这是正确的行为吗?
以下部分可能是您的问题的答案:
根据CDI 1.0规范 :
3.7。 Bean构造函数
当容器实例化bean类时,它会调用bean构造函数 。 bean构造函数是bean类的构造函数。
应用程序可以直接调用bean构造函数。 但是, 如果应用程序直接实例化bean ,则容器不会将任何参数传递给构造函数; 返回的对象不绑定到任何上下文; 容器没有注入依赖关系 ; 并且容器不管理新实例的生命周期。
HTH!
这是正确的行为,因为DI仅适用于容器管理的bean,而不适用于那些,你自己创建的。
- 我可以(以及如何)使用EJB模块中的javax.naming.Context#lookup查找CDI托管bean吗?
- 如何改变设计,使实体不使用注射?
- 如何使用@Inject批注在Java中堆叠自定义注释
- @Inject字段始终为null
- 从EJB无状态会话bean调用CDI会话范围的生产者方法
- 在CDI SessionScoped bean中注入HttpServletRequest
- CDI可以将标准库POJO注入EJB吗?
- 如何在WildFly上禁用WELD
- Java EE 7 – @Decorator,@ Stateless和@PersistenceContext = nullpointerException