2011-11-17 52 views
4

当我将EJB 3.1 bean注入到由@Inject创建的POJO中,然后注入工作。当我自己构建POJO时,它不会(Glassfish v3)。这是正确的行为吗?当CDI注入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 

解包耳结构:

│ 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 

它是正确的行为?

+0

我想你已经问了一下这个在评论你的前一个问题:http://stackoverflow.com/questions/8165482/cdi-inject-ejb-into-pojo-on-glassfish-v3 –

+0

是的,但这是评论中的问题,所以不是完整的stackoverflow问题。 – zacheusz

回答

11

下面的部分可能是一个回答你的问题:

CDI 1.0 specification

3.7。豆构造

当容器实例化一个bean类,它会调用豆 构造。 bean构造函数是bean类的构造函数。

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

HTH!

4

这是正确的行为,因为DI只适用于容器管理的bean,不适用于您自己创建的容器管理的bean。

+0

你确定吗?你能说明规范还是某事? – zacheusz

+1

Piotr Nowicki做到了 – madhead

+0

是的,看时间 – zacheusz