我一直在努力学习Java EE,但我永远无法运行EJB示例。 Oracle的指南使用netbeans,但我必须学习如何在Eclipse中完成它。书籍也没有提供任何帮助或youtube视频。
我可以毫无问题地运行servlets,jsp,jsf,但我总是遇到EJB问题。我错过了什么?
问题是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的初学者。谢谢!
答案 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();
}
}
}