扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
引言
IBM® WebSphere® Adapter 运行在 WebSphere Process Server 的 JCA 容器中,并通过 Java™ 2 Enterprise Edition (J2EE) Connector Architecture (JCA) 1.5 规范实现。本文介绍如何使用 WebSphere Adapter 的功能,通过动态更改 JCA ConnectionSpec 属性将不同的身份验证应用到 Enterprise Information System (EIS)。
WebSphere JCA 适配器通过 Managed Connection Factory 属性可以使用基本用户名和密码身份验证,也可以使用 WebSphere Application Server 中的 Java 身份验证和授权服务(Java Authentication and Authorization Services,JAAS)对象或身份验证别名 (Authentication Aliases)。如果您希望使用这些身份验证方法中的任意一种来更改用于身份验证的用户名和密码,则可以通过 WebSphere Application Server 域控制台和 JAAS 安全设置来重新部署适配器或更改用户名或密码。
通过将用户名和密码传递到代表相应 EIS 对象的 BusinessGraph,可以使用不同的(动态)身份验证调用适配器。
我们将构建一个基于 IBM WebSphere Adapter for SAP 的示例来演示此功能。
|
JCA 动态 Connection Specification Properties
WebSphere Process Server Version 6.0.1 BusinessGraph 实现拥有一个称为“properties”的子业务对象,可以按以下方式将其定义为 BusinessGraph 模式定义中的一个元素:
<element name="properties" type="anyType" minOccurs="0"/><!--DataObject-->
此业务对象可以拥有在 JCA 适配器上动态设置为 ConnectionSpec 的 JCA Connection Specification Properties。
要在不需要重新部署适配器的情况下使用不同的用户名和密码调用适配器,您需要:
com.ibm.j2ca.sap.SAPConnectionSpec
。
用户名和密码属性使用特殊前缀“CS”,以便将它们标识为 Connection Spec 属性。为了设置“用户名”和“密码”,您需要在业务对象的属性元素中设置“CSusername”和“CSpassword”。下面的清单 1 显示了 SAP 适配器的代码示例,该代码示例从包装业务对象创建 BusinessGraph,并使用拥有新用户名和密码的“CSusername”和“CSpassword”设置属性业务对象。
清单 1. 设置“CSuserName”和“CSpassword”的示例代码
BOFactory dataFactory = (BOFactory) ServiceManager.INSTANCE.locateService( "com/ibm/websphere/bo/BOFactory"); DataObject createSapSalesOrderBOWrapper = dataFactory.createByElement( "http://SAPPrueba/ScaArtifacts/SAPOutboundInterface", "createSapSalesOrderBOWrapper"); DataObject createSapSalesOrderBOWrapperInput = createSapSalesOrderBOWrapper.createDataObject( "createSapSalesOrderBOWrapperInput"); DataObject sapSalesOrderBOWrapper = createSapSalesOrderBOWrapperInput.createDataObject( "SapSalesOrderBOWrapper"); DataObject sapBapiSalesorderGetstatus = sapSalesOrderBOWrapper.createDataObject( "SapBapiSalesorderGetstatus"); sapBapiSalesorderGetstatus.setString("Salesdocument", "documento"); // Create the property business object DataObject prop = createSapSalesOrderBOWrapperInput.createDataObject("properties"); // Setting the property 'userName' to connection spec prop.setString("CSusername", "SAPUSERNAME"); //Setting the property 'password' to connection spec prop.setString("CSpassword", "SAPPASSWORD"); |
|
示例方案
该部分介绍如何使用 IBM WebSphere Adapter for SAP 构建一个示例方案,以便使用动态身份验证。
图 1. 示例方案的模块化组装图
安装并配置 IBM WebSphere Adapter for SAP
本文不打算阐述如何安装和配置 WebSphere Adapter for SAP。有关使用 WebSphere Integration Developer(以下称为 Integration Developer)安装、配置和部署适配器的帮助信息,请参阅 WebSphere Adapter for SAP 文档。
在示例方案中,通过使用 Integration Developer 中的 Enterprise Service Discovery 为具有 Create Operation 的示例 BAPI“BAPI_SALESORDER_GETSTATUS”配置一个简单的服务。在 Enterprise Service Discovery 过程中创建了接口“SAPOutBoundInterface”、一些数据类型和 EIS 导入。图 2 显示了创建的数据类型:
图 2. 示例方案的数据类型
如果已正确地安装、部署和配置了 SAP 适配器,则您应在 Integration Developer 中的 Business Integration View 中拥有一个 SCA 模块,并且组装关系图应类似于下面的图 3:
图 3. 带有 SAP EIS 导入的组装关系图
在 EIS 导入中配置 ConnectionSpec 类名
com.ibm.j2ca.sap.SAPConnectionSpec
。
图 4. 在 SAP EISSet 导入中设置 Connection Spec 类
将 Authentication Properties 中的 Res-Auth 字段设置为 Application
图 5. 在 SAP EIS 导入中设置 Res Auth
创建新接口来测试该功能
创建一个附加接口,以便能够动态测试此功能。此接口会匹配原始的 SAPOutboundInterface,仅有一处不同:我们将添加几个输入参数,以便能够传递用户名和密码。
创建设置 Properties 元素值的 Java 组件
导出 Java 组件
生成 Java 实现
为先前创建的 Java 组件生成 Java 实现。该实现将设置动态用户名和密码。
public DataObject createSapBapiSalesOrderGetStatusWrapper( DataObject createSapBapiSalesOrderGetStatusWrapperInput)
在我们的示例中,createSapBapiSalesOrderGetStatusWrapper
是 BusinessGraph createSapBapiSalesOrderGetStatusWrapperInput
的包装程序。我们需要在 BusinessGraph 的属性子对象中设置动态 Connection Specification 属性(在本例中是用户名和密码)。然后,我们将打包的 BusinessGraph 传递到将从 SAP 返回 SAP 业务对象的 SAP 适配器,接着将其传递回 Java 组件的调用方。下面是针对本示例的这一方法的完全实现:
清单 2. 方法的实现
public DataObject createSapBapiSalesOrderGetStatusWrapper( DataObject createSapBapiSalesOrderGetStatusWrapperInput, String username, String password) { DataObject prop= createSapBapiSalesOrderGetStatusWrapperInput.getDataObject("properties"); // check if they already created this child object or not if (null == prop) { System.out.println("*** Properties not found in this DataObject. " + "Creating properties child BO..."); prop = createSapBapiSalesOrderGetStatusWrapperInput.createDataObject("properties"); } // Setting the conn spec property 'username' // Note that the username property is prefixed by CS prop.setString("CSusername", username); // the userName\password is used by reflection to create Method from it ,so // this must match the ConnectionSpec getter-setter method string // Setting the conn spec property 'password' // Note that the password property is prefixed by CS prop.setString("CSpassword", password); // invoke the adapter Service serv= locateService_SAPOutboundInterfacePartner(); Object boReturn= serv.invoke( "createSapBapiSalesOrderGetStatusWrapper", createSapBapiSalesOrderGetStatusWrapperInput); // return the result BO that we got back from SAP return (DataObject)boReturn; } |
|
测试示例方案
要对导出启动测试组件,请执行下列步骤:
如果您输入了正确的数据、用户名和密码,则测试应能够成功,并且会在测试组件面板中看到从 SAP 返回的对象。如果您无法为 SAP 业务对象输入正确的数据,则会遇到来自 SapBaseException 的业务异常。如果您无法输入正确的用户/密码组合,则会看到以下内容的 ResourceException:Exception in connecting to SAP:Error MsgName or password is incorrect.Please re-enter。您可以使用不同的用户名和密码组合尝试若干次,来了解如何完成数据输入。使用未知的用户名和/或密码进行尝试,以了解 SAP 如何抛出异常。
|
结束语
可以通过编程方式将 Connection Specification 属性传递到 JCA 适配器;因此,可以动态更改这些属性。本文通过一个使用 WebSphere Adapter for SAP 的示例,向您介绍了如何动态更改用户名和密码属性。此方法还可用于其他适配器。此功能适用于不同的方案,但是,我们在此处侧重介绍了基本方案,以便您可以将其应用到特定的方案中。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者