如何在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
然後cd
到struts2
目錄並運行以下命令(這將彙編爲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/。
不,只是一個直的@EJB註釋。 – g051051 2010-05-18 19:16:32
感謝您的解釋。這很好地解釋了爲什麼我的監聽器(由web.xml條目中的容器實例化)工作,但我的操作(由struts實例化)沒有。我只是假設任何帶註釋的類將通過某種類加載器巫術來處理。這種事情記錄在任何地方嗎? – g051051 2010-05-19 12:44:49
@ 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