当CDI注入POJO应该有效吗?(GlassFish v3)

zac*_*usz 4 java ejb glassfish cdi ejb-3.1

当我将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");
    }

}
Run Code Online (Sandbox Code Playgroud)

_

public class MyPOJO {
        @Inject NewSingletonBean newSingletonBean;

        public void sth(){
            System.out.println("EJB injected into POJO: " + (newSingletonBean != null));
        }
}
Run Code Online (Sandbox Code Playgroud)

不起作用:

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

}
Run Code Online (Sandbox Code Playgroud)

_

这个工作正常:

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

}
Run Code Online (Sandbox Code Playgroud)

我正在使用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
Run Code Online (Sandbox Code Playgroud)

未包装的EAR结构:

?   CDITest-ejb.jar
?   CDITest-war.war
?
????META-INF
        MANIFEST.MF
Run Code Online (Sandbox Code Playgroud)

解压缩的EJB模块jar结构:

????META-INF
?       beans.xml
?       MANIFEST.MF
?
????tries
        MyPOJO.class
        NewSingletonBean.class
        NewSingletonBean2.class
Run Code Online (Sandbox Code Playgroud)

这是正确的行为吗?

Pio*_*cki 11

以下部分可能是您问题的答案:

根据CDI 1.0规范:

3.7.Bean构造函数

当容器实例化bean类时,它会调用bean构造函数.bean构造函数是bean类的构造函数.

应用程序可以直接调用bean构造函数.但是,如果应用程序直接实例化bean,则容器不会将任何参数传递给构造函数; 返回的对象不绑定任何上下文; 容器没有注入依赖关系 ; 并且容器不管理新实例的生命周期.

HTH!