0

我一直在尝试学习 Java EE,但我永远无法运行 EJB 示例。Oracle 的指南使用 netbeans,但我必须学习如何在 Eclipse 中进行操作。书籍也没有任何帮助或 youtube 视频。

我可以毫无问题地运行 servlet、jsp、jsf,但我总是遇到 EJB 问题。我错过了什么?

我认为问题出在 Eclipse 中的配置。我在 Eclipse 中的项目结构如下:

我在 Eclipse 中的项目结构如下

HelloWorld.java 文件的代码:

package helloworld.ejb;
import javax.ejb.Remote;

@Remote
public interface HelloWorld {
    public String outputHelloWorld();
}

HelloWorldBean.java 文件的代码

package helloworld.ejb;
import javax.ejb.Stateless;

@Stateless
public class HelloWorldBean implements HelloWorld {
    public String outputHelloWorld() {
    return "Hello World!";
    }
}

HelloWorldClient.java 的代码

package helloworldprojectclient;

import javax.ejb.EJB;
import helloworld.ejb.HelloWorld;

public class HelloWorldClient {
@EJB
private static HelloWorld helloWorld;
public static void main (String[] args) {
    System.out.println(helloWorld.outputHelloWorld());
    }
}

我使用 Glassfish 4.0 作为服务器。HelloWorldProject 是一个“EJB 项目”,而“helloworldprojectclient”是一个常规 Java 项目,我已将 javaee.jar(来自 glassfish 目录)添加到构建路径中。

当我尝试运行 HelloWorldClient.java 时,出现以下异常:

Exception in thread "main" java.lang.NullPointerException at helloworldprojectclient.HelloWorldClient.main(HelloWorldClient.java:10) 这是以下行: System.out.println(helloWorld.outputHelloWorld());

问题是什么?我提到我是 EJB 的初学者。谢谢!

4

2 回答 2

2

以防万一您仍然对此感兴趣:

第一个版本不起作用,因为您试图在不受Container管理的类中注入 ejb 引用。当您执行 main 方法时,@EJB 注释被忽略,因此“HelloWorld”类成员永远不会被初始化。

为了在不修改的情况下执行此代码,您需要在将注入 ejb 引用的应用程序客户端容器中执行该类。

您的第二个版本运行,因为您不是委托给容器,而是通过 JNDI 服务获取 ejb 引用。这是容器注入不可用时的建议方式。

于 2013-11-15T19:37:00.340 回答
0

我设法让它工作。我不知道这是否正确,但在“helloworldprojectclient”中,如果您设置构建路径的“项目”选项卡并添加 HelloWorldProject,然后在“库”选项卡上添加 appserv-rt.jar 和 javaee.jar(均来自 glassfish lib 文件夹)然后客户端应如下所示:

package helloworldprojectclient;
import javax.naming.InitialContext;
import helloworld.ejb.HelloWorld;

public class HelloWorldClient {

public static void main(String[] args) {
    try {
        InitialContext ic = new InitialContext();
        HelloWorld thing = (HelloWorld) ic.lookup("helloworld.ejb.HelloWorld");
        System.out.println("It seems it runs: " + thing.outputHelloWorld());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}
于 2013-09-01T23:23:56.667 回答