首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 第二书店 程序员
您的位置:Java->轻松应对 WS-Security 规范互操作性挑战之使用 EJB 代理

轻松应对 WS-Security 规范互操作性挑战之使用 EJB 代理2007-11-09 来自:conanpaul  [收藏到我的网摘]

本系列之前的文章介绍了 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 接口的复杂数据类。

任务 4 需要为以下应用程序创建可部署包:

客户机应用程序。需要对此应用程序重新打包,因为需要对其更新,以与 EJB 代理应用程序集成。客户机应用程序可能还需要包括共享库(如果使用)的 JAR 文件。
EJB 代理应用程序。此应用程序必须打包为 EAR 文件,而且其中还可能包括共享库(如果使用)的 JAR 文件。
任务 7 中给出的解决方案部署工作需要部署以下应用程序:

客户机应用程序
EJB 代理应用程序
未更改的 Web 服务提供者应用程序






回页首




构建解决方案

此部分描述如何创建合适的 EJB 代理,以便用于将客户机与提供者应用程序集成。下面的代码片段摘自示例应用程序。提供这些代码的目的是为了方便您了解如何将此方法应用于自己的应用程序。表 2 说明了所需的任务。

表 2. 创建解决方案所需的步骤和产品

任务 步骤 应用程序类型 环境 负责角色
1. 创建 J2EE 1.4 EJB 代理应用程序,在单个 J2EE 1.4 EJB 项目(如 EJBProxy)中包括以下构件:
一个 J2EE 1.4 会话 Bean
一个 J2EE 1.4 Web 服务客户机代理
完成这些步骤,以创建 J2EE 1.4 会话 Bean:
创建带有 EJB 客户机 JAR 项目的 EJB 项目。
在 EJB 项目中创建 EJB 会话 Bean,如 DefaultSessionBean。
创建 EJB 会话 Bean 方法,如 public SampleOperationResponse makeWebservicesCall(String inputString)。
在 EJB 项目中创建 J2EE 1.4 Web 服务客户机。
EJB 代理 Rational Application Developer 应用程序开发人员
2. 如果有必要,创建一个共享库,其中包含 Web 服务中使用的类文件。 完成这些步骤,以创建共享库:
创建 Java 项目。
将 EJB 项目中创建的 J2EE1.4 Web 服务客户机类移动到 Java 项目中。
EJB 代理、客户机应用程序 Rational Application Developer 应用程序开发人员
3. 将 J2EE 1.3 客户机应用程序与 J2EE 1.4 EJB 会话 Bean 集成。 更新客户机应用程序,以进行 EJB 调用。 客户机应用程序 Rational Application Developer 应用程序开发人员
4. 将 EJB 会话 Bean 与 Web 服务客户机代理集成。 更新 EJB 会话 Bean 方法 public SampleOperationResponse makeWebservicesCall(String inputString),以进行 Web 服务调用。 EJB 代理 Rational Application Developer 应用程序开发人员
5. 针对 WS-Security 配置 EJB 代理应用程序。 配置 EJB 代理应用程序,以启用安全性。 EJB 代理 Rational Application Developer 部署人员
6. 打包解决方案。 为以下解决方案应用程序创建包:
客户机应用程序
EJB 代理
Web 服务提供者
客户机应用程序、EJB 代理、Web 服务提供者 Rational Application Developer 部署人员
7. 在运行时上部署和测试解决方案。 在运行时环境中部署和测试已打包的解决方案应用程序 客户机应用程序、EJB 代理、Web 服务提供者 WebSphere Application Server 部署人员和测试工程师

任务 1. 创建 EJB 代理应用程序

要完成此步骤,请进行以下工作:

所需的 EJB 操作如表 2 中所示。请参见参考资料,其中提供了指向如何实现所需 EJB 相关操作的详细说明的链接。
下面说明了创建 Web 服务客户机所需的基础知识。请参见解决方案概述和参考资料部分给出的链接,其中提供了关于 Web 服务客户机相关操作的详细说明。
在 Rational Application Developer 中调用 Web Service Client Wizard。
在 Web Service Selection Page 上选择 Java 代理作为客户机类型,并输入指向 WSDL 的 URL。
在 Client Environment Configuration Page 上将 J2EE 版本指定为 1.4,并将 EJB 指定为客户机类型,并指定客户机项目和 EAR 项目。
任务 2. 创建共享库

完成了任务 1 并创建 Java 项目后,就准备好移动 J2EE 1.4 Web 服务客户机类了。请参见参考资料部分,以获得实现此步骤的详细说明。生成的 Web 服务客户机类位于 Web 服务的目标命名空间所决定的文件夹中。以下是要移动的文件的列表:

每个复杂数据类型的 Java 类。示例应用程序的相关类名称为 SampleOperationResponse。
每个复杂类型的序列化器、反序列化器和 Helper 类 *_Ser、*_Deser 和 *_Helper。示例应用程序相关的类名称为 SampleOperationResponse_Ser、SampleOperationResponse_Deser 和 SampleOperationResponse_Helper。
客户机代理和客户端存根 *_PortTypeProxy 和 *SOAPStub。示例应用程序相关的类名称为 SampleOperationResponse_PortTypeProxy 和 SampleServiceSOAPStub。
客户端服务器定位符的接口和实现类 *_Service 和 *_ServiceLocator。示例应用程序相关的类名称为 SampleService_Service 和 SampleService_ServiceLocator。
WebSphere 特定的扩展类 *_ServiceInformation。示例应用程序的相关类名称为 SampleService_ServiceInformation。
图 2 显示了为示例应用程序重新分配的文件。


图 2. 重新分配的文件


移动 Web 服务客户机类会导致编译错误,因为 J2EE.jar 和 webservices.jar 文件不位于 Java 项目最初的 Java 构建路径中。完成了任务 4. 打包解决方案应用程序后,会在 Java 项目的 Java 构建路径中包括相应的库(其中包括 J2EE.jar 和 webservices.jar 文件)。

任务 3. 从客户机应用程序调用 EJB 代理应用程序

完成了表 2 的任务 1 和任务 2 后,就准备好进行此步骤了。此部分说明对客户机应用程序所需的更新,以便调用 EJB 代理(此代理将调用 Web 服务提供者)。

添加负责进行 EJB 代理调用和返回复杂对象的方法。示例应用程序使用 Java 类 EJBAccessBean 作为 Servlet 应用程序的一部分,并使用 public SampleOperationResponse ejbCall(String inputString) 方法进行 EJB 代理调用。EJBAccessBean 位于 SampleClient 对象。

清单 1. 进行 EJB 调用的示例 Servlet 方法


/**
* Step 1. Add required imports
**/

package test.bean;

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

import com.test.SampleOperationResponse;
import ejbs.DefaultSession;
import ejbs.DefaultSessionHome;
...

public SampleOperationResponse ejbCall(String inputString)
{
//Enterprise Bean name is: DefaultSession
DefaultSession sampleProxy = null;
Hashtable env = new Hashtable();
SampleOperationResponse responseObj = null;

try
{

/**
* Step 2. Set the following JNDI environment properties in the
* initial context constructor and get the initial context.
* i. java.naming.provider.url (provider URL) property that specifies the
* location of the registry.
* ii.java.naming.factory.initial which specifies the class name of the
* initial context factory for the registry service provider.
**/

env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL, "corbaloc::localhost:2809");

InitialContext initialContext = new InitialContext(env);
...


/**
* Step 3. Perform the lookup
**/

String jndiName = "ejb/ejbs/DefaultSessionHome";
Object ejbObj = initialContext.lookup(jndiName);
...


/**
* Step 4. Get the home interface for the EJB Proxy: DefaultSession.
**/

DefaultSessionHome home = (DefaultSessionHome) PortableRemoteObject
.narrow(ejbObj, DefaultSessionHome.class);
...


/**
* Step 5. Obtain the remote reference for the EJB Proxy: DefaultSession.
**/

sampleProxy = home.create();
...

/**
* Step 6. Invoke and work with the remote EJB method,
* makeWebservicesCall(String inputString, OtherMethodParameters parameters)
**/

responseObj = sampleProxy.makeWebServicesCall(inputString);
...
}
catch(Exception e)
{
System.out.println("EJBAccessBean::ejbCall() -> Caught an error with
following reason: " + e.getMessage());
}

return responseObj;
}




由于客户机和 EJB 代理应用程序可能不会像图 1 中所示的那样驻留在相同的应用服务器容器中,因此无法使用缺省上下文属性来查找 EJB 会话 Bean 的主接口。

清单 2 的粗体代码片段说明了调用 public SampleOperationResponse ejbCall(String inputString) 方法的第二个更新,此方法进行 EJB 调用并在示例客户机应用程序 public class SampleServlet2_3 中返回复杂对象 SampleOperationResponse。public class SampleServlet2_3 也位于 SampleClient 项目中。

清单 2. 进行 EJB 代理调用

...
import com.test.SampleOperationResponse;
import test.bean.EJBAccessBean;
...

public class SampleServlet2_3 extends HttpServlet implements Servlet
{
...

protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws
ServletException, IOException
{
...
displayInputPage(arg0, arg1);
...
}
...

protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws
ServletException, IOException
{
...
String inputValue = (String)arg0.getParameter("inputText");
if (inputValue != null)
{
...

EJBAccessBean accessBean = new EJBAccessBean();
SampleOperationResponse responseObj = accessBean.ejbCall(inputValue);
...
}
...
}
...
}




构建解决方案的下一步是更新 EJB 项目中的会话 Bean,以使用 Web 服务客户机代理类调用 Web 服务提供者。

任务 4. 从 EJB 会话 Bean 调用 Web 服务提供者应用程序

清单 3 中所示的代码片段显示了 EJB 会话 Bean 方法 public SampleOperationResponse makeWebservicesCall(String inputString),此方法在表 2 的任务 1 中创建。此方法使用 Web 服务客户机代理类 SampleService_PortTypeProxy 调用 Web 服务提供者,并将复杂对象 SampleOperationResponse 返回到其调用方。EJB 会话 Bean public class DefaultSessionBean 位于 EJBProxy 项目。

推荐人评论

本系列之前的文章介绍了 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 代理方法最适合用于需要轻量级低成本解决方案来满足沙箱、测试或概念验证需求的情况。

用户评论

正在载入评论列表...

是谁推荐了此篇文章

专家头像MichaelCSDN测试频道编辑 联系email:mjj@csdn.net
个人blog发送信息
Michael推荐的其他文章

赞助商精华文章

热点新闻

热点评论

    精彩视频

    精彩专题

    资源下载

    网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|版权声明|问题报告

    北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号

    世纪乐知(北京)网络技术有限公司 提供技术支持

    Copyright ? 2000-2008, CSDN.NET, All Rights Reserved

    GongshangLogo