2010-05-18 15 views
3

我有一個應用程序試圖使用@EJB註釋在我的ejb.jar文件中注入EJB的遠程引用。我收到了不一致的結果。在一個案例中,我在web.xml中有一個被調用的監聽器,並且顯然已經正確注入了EJB,因爲我可以看到它連接到EJB並在其上調用方法。在另一個類(一個struts2動作)中,當它試圖訪問EJB引用時,我得到NPE。據我所知,在同一個.war文件中的Java類中,它們是相同的調用。Glassfish web應用程序中的EJB注入

作爲解決方法,我在構造函數中添加了代碼,以通過它們的全局JNDI名稱查找EJB,並且它工作正常。我只是不明白爲什麼一個@EJB的作品,而不是另一個。

回答

3

如何在Struts 2操作中注入EJB?你在使用CDI嗎?你使用的是Struts2 CDI plugin

更新:問題是容器沒有創建Struts對象,因此容器沒有得到注入任何東西的機會。您必須使用提到的plugin for CDI才能在您的操作中啓用注射。

如果你想給它一個嘗試,得到的Struts 2來源:

svn co http://svn.apache.org/repos/asf/struts/struts2/trunk/ struts2 

然後cdstruts2目錄並運行以下命令(這將彙編爲struts-cdi-plugin所需要的模塊)

mvn install -pl plugins -am 

然後獲得CDI-插件來源:

svn co https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-cdi-plugin/ 

並編譯:

mvn install 

現在,在我的pom.xml以下依賴性:

<dependency> 
    <groupId>org.apache.struts</groupId> 
    <artifactId>struts2-core</artifactId> 
    <version>2.2.0-SNAPSHOT</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.struts</groupId> 
    <artifactId>struts2-cdi-plugin</artifactId> 
    <version>2.2.0-SNAPSHOT</version> 
</dependency> 
<dependency> 
    <groupId>javassist</groupId> 
    <artifactId>javassist</artifactId> 
    <version>3.8.0.GA</version> 
</dependency> 

我能得到在行動注入一個EJB:

public class HelloWorld extends ActionSupport { 

    @Inject 
    HelloEJB helloEjb; 

    @Override 
    public String execute() throws Exception { 
     setMessage(helloEjb.getMessage()); 
     return SUCCESS; 
    } 

    private String message; 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public String getMessage() { 
     return message; 
    } 

} 
例如

請參閱https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-cdi-example/

+0

不,只是一個直的@EJB註釋。 – g051051 2010-05-18 19:16:32

+0

感謝您的解釋。這很好地解釋了爲什麼我的監聽器(由web.xml條目中的容器實例化)工作,但我的操作(由struts實例化)沒有。我只是假設任何帶註釋的類將通過某種類加載器巫術來處理。這種事情記錄在任何地方嗎? – g051051 2010-05-19 12:44:49

+0

@ g051051監聽器是一個所謂的「託管」組件和注入工作(因爲Java EE 5,例如,請參閱http://java.sun.com/developer/technicalArticles/J2EE/intro_ee5/#injection)。通過使用CDI在任何POJO中進行注入(但您必須使用CDI或CDI「感知」框架),Java EE 6超越了此限制。 – 2010-05-19 13:05:21

相關問題