新手进入EJB世界... EJB客户端中的空指针异常

4

我正在学习EJB,并尝试执行EJB In Action书中提供的Helloworld示例。

我的应用服务器是JBoss,我在正确的目录中创建了bean类和接口的Jar文件(我可以在JMX控制台中看到EJB)。

现在我使用EJB注释创建了一个简单的客户端,但是我得到了NullPointerException。

这是我的客户端代码:

package com.client;
import javax.ejb.EJB;
import com.EJB.*;

public class HelloWorldClient {
 @EJB
 private static HelloWorldInterface HelloBean;

 public static void main(String[] args)
 {
  HelloBean.SayHelloWorldInEJB();
 }
}

Bean class

package com.EJB;

import javax.ejb.Stateless;

@Stateless
public class HelloWorldBean implements HelloWorldInterface {

 public void SayHelloWorldInEJB() {
  // TODO Auto-generated method stub
  System.out.println("Hello world from the world of EJB");

 }
}

接口

package com.EJB;
import javax.ejb.Local;;

@Local
public interface HelloWorldInterface {
 public void SayHelloWorldInEJB();
}

注意:尽管我将接口指定为Remote,但它仍然无法正常工作。
到目前为止,我所做的步骤如下: 1)创建了EJB文件 2)制作了build.xml并部署了EJB。
我是否遗漏了任何配置文件?

能否添加你的堆栈跟踪信息,这将有助于其他人理解和诊断问题。 - Kevin D
2个回答

5
现在我使用EJB注释创建了一个简单的客户端,但是我遇到了NullPointerException。
您的客户端代码看起来像一个应用程序客户端,并且这样的客户端应该部署在应用服务器上,并在应用程序客户端容器(ACC)中执行,以便进行注入。启动ACC需要一个特定于应用服务器的命令。
以下维基解释了在JBoss中使用ACC的用法(如何打包、部署和启动ACC):如何在JBoss-5中使用应用程序客户端。
如果您不想使用应用程序客户端容器,而只是通过java命令运行应用程序客户端类,则无法进行注入,您必须执行JNDI查找。
而且,在这两种情况下,您都必须提供和使用bean的远程业务接口。
资源

相关问题


这个答案是不正确的。应用程序客户端并没有部署到应用服务器上。我可以理解为什么“容器”这个词会让人们认为是这种情况,但实际上并不是这样。请参见此链接中的图表和描述以及此处的第一段。 - DavidS
我现在意识到我错了:我发现应用客户端确实已经部署到了应用服务器上。但是这对我来说没有任何意义。我之前分享的第一个链接指出,“应用客户端在客户机上运行”,但是我们怎么可能既让应用客户端在客户机上运行,又将其部署到应用服务器上呢?!(在答案被编辑之前,我无法撤回我的踩。) - DavidS
我在检查Glassfish管理控制台时发现我的应用客户端确实被“部署”到了服务器上,意识到我之前是错误的。 - DavidS

4
你需要进行两个更改:
1. 用JNDI查找替换@EJB依赖注入。在EJB 3中,不支持将依赖注入用于POJOs(不过EJB 3.1可能支持)。
2. 接口必须是远程接口。原因是客户端是一个独立的Java程序 - 它将在与Web应用程序JVM不同的JVM中运行。
如果客户端是同一服务器上的servlet,则通过@EJB进行依赖注入和将接口设置为@Local都可以工作。

实际上,看起来OP正在使用应用程序客户端,即预计在应用程序客户端容器(ACC)中运行的代码,这使得在客户端注入私有静态EJB成为可能。 - Pascal Thivent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接