3

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

作为一种变通方法,我在构造函数中添加了代码以通过全局 JNDI 名称查找 EJB,它工作正常。我只是无法弄清楚为什么一个@EJB 有效,而不是另一个。

4

1 回答 1

3

如何在 Struts 2 动作中注入 EJB?你在用 CDI 吗?您在使用Struts2 CDI 插件吗?

更新:问题是容器没有创建 Struts 对象,Struts 是,所以容器没有机会注入任何东西。您必须使用提到的 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>

我能够在一个动作中注入一个 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/ 。

于 2010-05-18T19:11:00.657 回答