引言
本系列之前的文章介绍了 WS-Security 规范级别的互操作性问 题,可帮助您选择合适的解决办法。本文重点讨论如何实现 EJB 代理方法。此 方法涉及到构建 EJB Web 服务代理,将其作为 J2EE 1.3 客户机和 J2EE 1.4 Web 服务提供者之间的粘合剂。与本系列以前的文章中所述的中间件代理方法相 比,实现 EJB 代理方法只是基本的编程做法。如果您的前端中间件层包含 WebSphere Application Server V6.0 或更高版本,或者其他能够支持 J2EE 1.4 应用程序的 J2EE 应用程序,则不需要其他中间件基础设施。另外, 此方法的可扩展性不如中间件代理方法,因为需要对每个 J2EE 1.3 客户机应用 程序进行手动修改。本文中所述的 EJB 代理方法最适合用于需要轻量级低成本 解决方案来满足沙箱、测试或概念验证需求的情况。
实现 EJB 代理方法 所需的工作主要是应用程序开发工作,不过此解决方法还引入了另一个应用程序 ,需要操作团队进行部署、保护和管理。此方法还需要涉及测试人员和部署人员 。
实现 EJB 代理方法的应用程序开发人员应该具备基本 J2EE 和 Web 服务开发技能。
本文将详细说明如何使用完全实现的示例(可供 在您的环境中部署)实现 EJB 代理方法。了解解决方案部分将对此方法进行详 细说明。构建解决方案部分将说明如何开发所提供的示例应用程序。使用示例应 用程序部分将说明如何在运行时环境中自定义和运行示例应用程序。
了 解解决方案
示例应用程序假定您在尝试对以下内容进行集成:
需 要 WS-Security 的 J2EE 1.4 Web 服务提供者应用程序
需要调用 Web 服务提供者的 J2EE 1.3 客户机应用程序
图 1 为示例 EJB 代理解决方 法的详细运行时视图。在图 1 中客户机应用程序(一个 J2EE 1.3 Servlet)使 用 RMI/IIOP 与 J2EE 1.4 EJB 代理应用程序通信。然后,EJB 代理应用程序将 使用 Web 服务及 WS-Security V1.0 规范与 Web 服务提供者应用程序通信。请 注意,客户机应用程序可以为无法使用 WS-Security V1.0 规范通信的 J2EE 1.3 Servlet、J2EE 1.3 Portlet 或任何客户机应用程序。
图 1. EJBProxy 解决方案组件
创建解决方案所需的任务和产品如表 1 中所示。
表 1. 创建解决方 案所需的任务和产品
任务 | 环境 | 负 责角色 |
1. 创建 J2EE 1.4 EJB 代理应用程序,在单个 J2EE 1.4 EJB 项目中包括以下构件:
一个 J2EE 1.4 会话 Bean 一个 J2EE 1.4 Web 服务客户机代理 |
Rational Application Developer | 应用程序开发人员 |
2. 如果有必要,创 建一个共享库,其中包含 Web 服务中使用的类文件。 | Rational Application Developer | 应用程序开发人员 |
3. 将 J2EE 1.3 客户机应用程序与 J2EE 1.4 EJB 会话 Bean 集成。 | Rational Application Developer | 应用程序开发人员 |
4. 将 EJB 会话 Bean 与 J2EE 1.4 Web 服务客户机代理集 成。 | Rational Application Developer | 应用程序开发人员 |
5. 针对 WS-Security 配置 EJB 代理应用程序。 | Rational Application Developer | 应用程序开发人员 |
6. 打包解决方案。 | Rational Application Developer | 应用程序开发人员 |
7. 在运行时上部署 解决方案并进行单元测试。 | WebSphere Application Server | 部署人员和测试工程师 |
任务 1 的实现涉及到使用 Rational Application Developer 中恰当的向导来开发会话 Bean 和 Web 服务 客户机代理。可以在构建解决方案部分中找到关于这方面的详细示例。
任务 2 的实现取决于您的应用程序需求。如果您的 Web 服务接口包括复杂的对 象类型,则需要创建共享库,以便在客户机应用程序和 EJB 代理应用程序之间 传递复杂对象。由于 J2EE 1.3 客户机应用程序和 EJB 代理使用 RMI 进行通信 ,这些对象类必须可序列化,即必须实现 java.io.Serializable 接口。通过使 用 Rational Application Developer 中恰当的 Web 服务代码生成选项,可以 创建实现 java.io.Serializable 接口的复杂数据类。