我有一个应用程序正在尝试使用@EJB注释将远程引用注入到我的ejb.jar文件中的EJB。我得到的结果不一致。在一种情况下,我在web.xml中有一个侦听器,该侦听器被调用并且显然已正确注入EJB,因为可以看到它连接到EJB并在其上调用方法。在另一个类中(struts2动作),当它尝试访问EJB引用时,我得到了NPE。据我所知,在相同的.war文件中的Java类中,它们是相同的调用。

解决方法是,我在构造函数中添加了代码,以通过其全局JNDI名称查找EJB,并且工作正常。我只是想不通为什么一个@EJB可以工作而不能另一个。

最佳答案

如何在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插件的来源:
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注入到Action中:
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/

关于jakarta-ee - Glassfish Webapp中的EJB注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2860095/

10-13 05:30