我有一个应用程序试图使用@EJB注释在我的ejb.jar文件中注入对EJB的远程引用。我得到了不一致的结果。在一种情况下,我在web.xml中有一个被调用的监听器,并且显然正确地注入了EJB,因为我可以看到它连接到EJB并在其上调用方法。在另一个类(struts2操作)中,我在尝试访问EJB引用时获得NPE。据我所知,它们是相同的调用,存在于同一个.war文件中的Java类中。
作为一种解决方法,我在构造函数中添加了代码以通过其全局JNDI名称查找EJB,并且它工作正常。我无法弄清楚为什么一个@EJB工作而不是另一个。
答案 0 :(得分:3)
如何在Struts 2操作中注入EJB?你在用CDI吗?您使用的是Struts2 CDI plugin吗?
更新:问题是容器没有创建Struts对象,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-plugin的源代码:
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>
我能够在Action中注入一个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/。