远程EJB客户端Eclipse

时间:2013-09-01 22:03:31

标签: eclipse java-ee glassfish ejb client

我一直在努力学习Java EE,但我永远无法运行EJB示例。 Oracle的指南使用netbeans,但我必须学习如何在Eclipse中完成它。书籍也没有提供任何帮助或youtube视频。

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

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

My Project Structure in Eclipse is the following

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的初学者。谢谢!

2 个答案:

答案 0 :(得分:2)

万一你仍然对此感兴趣:

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

为了在不进行修改的情况下执行此代码,您需要在Application Client Container中执行将注入ejb引用的类。

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

答案 1 :(得分:0)

我设法让它发挥作用。我不知道这是否是正确的方法,但在“helloworldprojectclient”中,如果你设置buildpath的Project选项卡并添加HelloWorldProject然后在Libraries选项卡上添加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();
    }
}

}