background image

 

Java 编程:

 

寻找 bean 的 Home 接口

EJB 错误?不要慌!

 

  您已经在自己所钟爱的 Java 

 

书籍中读过了关于企业 Javabean 技术的那一章,也已经

 

练习过了简单的 HelloWorld bean,并遵循所建议的部署过程发布了它。现在您得编写一个

 

客户机,以便通过这个客户机来调用这个杰作。因此您写出了类似清单 1 中的代码:

 

  清单 1. 

 

一个调用 bean 的非常简单的客户机

1

InitialContext ic = 

new

 InitialContext();

2

Object or = ic.lookup("ejb/HelloWorldHome");

3

if

 (or != 

null

) {

4

  

//

 

Narrow the return object to the Home class type

5

    HelloWorldHome home = 

6

      (HelloWorldHome)PortableRemoteObject.narrow(or, 

7

        HelloWorldHome.

class

);

8

  

//

 

Create an EJB object instance using the home interface.

9

    HelloWorld hw = home.create();

10

  

//

 

Invoke the method

11

    System.out.Println(hw.hello());

12

}

13

 

  在命令行中运行这个客户机,使用手头最方便的一个 Java 

 

 

安装 ―― 即应用服务器

使 用的那一个。所有事情都很完美!带着成功的喜悦,您转移到第二台计算机上运行您的
客 户 机 。 这 回 , 您 得 到 了 一 个 可 怕 的 错 误 消 息 。 首 先 , 您 可 能 得 到 
java.lang.NoClassDefFoundError:   javax/ejb/EJBObject   , 然 后 是 一 大 堆 其 他 的

 

NoClassDefFoundError s

 

,因为您忘记提交一个带有必需的 stub   

和 tie   

的 JAR 文件,并且

 

没有提供或者考虑到其他各种 EJB 相关的内容。不过最终,您的客户机运行到了第一行
有意思的代码( InitialContext ic = new InitialContext(); )

 

。在到达这一行时得到的异常 ―― 

 

 

 

 

您几乎肯定会得到一个异常 ―― 将会根据您所选择的特定 上下文 provider 而有所不同。
  解释这些术语

 

  在我们继续往下之前,定义几个术语会很有帮助。计算世界 使用的都是一些奇怪的
术 语 、 时 髦 的 语 汇 和 首 字 母 缩 写 词 , Java   技 术 也 不 例 外 ( 也 许 这 应 该 是 
JavaIsNoException ?)。如果您遇到了上面所说的问题,那么这里面的术语可能会让您感到
有些无所适从。所以让我们讨论在本文中将会遇到的术语,搞明白它们的意思是一个好主 
意。

 

 

 

  名称空间、上下文、初始上下文和子上下文 这些术语都是有关位置的 ―― 是从客户

 

机的角度看时 EJB 

 

 

组件所在的概念性的位置。将一个 名称空间 想像为一个城镇,城镇中

 

的商店由 EJB home 接口(我们将在稍后讨论它)

 

 

表示。 上下文是城镇中的一个位置。 初始

 

 

 

 

上下文 是您开始时所在的位置 ―― 就像它是到城镇的道路。而 子上下文是街道名。
  home

 

接口 (home interface)和远程接口(remote interface) 

 

企业 JavaBean 组件有三个部