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

作为解决的工作,我在构造函数中添加了代码,以通过其全局JNDI名称查找EJB,并且效果很好。我只是不知道为什么一个@ejb起作用而不是另一个工作。

有帮助吗?

解决方案

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

更新: 问题在于容器没有创建支柱对象,撑杆是,因此容器没有机会注入任何东西。您必须使用上述 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/strunk/struts2-cdi-example/ 例如。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top