2011-11-17 75 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