SCA 应用程序的 SDO 数据绑定(已弃用)
服务数据对象 (SDO) 是数据应用程序开发框架,用于提供体系结构和应用程序编程接口 (API)。 服务组件体系结构 (SCA) 的产品支持包括 SDO 2.1.1 接口的实施。 为了在 SCA Java™ 客户端和实现中使用 SDO,了解 SDO 数据绑定概念会很有帮助。
产品支持 OSOA 和 OASIS 规范的 SDO,除非在本主题中另有陈述。
SDO 数据绑定支持包含以下概念:
作用域管理
在 SDO 中,一个作用域一般对应于一个 commonj.sdo.helper.HelperContext 实例。 该作用域为 SDO 类型设置可视性边界。 在产品运行时环境中,SCA 层在 SCA 应用程序边界上定义 HelperContext 对象,这些是 SCA 角度的有意义边界。 SCA 和 SDO 一起为给定应用程序定义缺省 HelperContext 并使 SCA 应用程序可以用编程方式访问 HelperContext。
在产品运行时环境中,主要 SCA 应用程序作用域绑定到可部署的组合。 可部署的组合与运行时环境中受管的 SCA 缺省 HelperContext 之间存在 1-1 关系。 要确定 SCA 组件的缺省 HelperContext,您必须标识向 SCA 域定义此组件的可部署组合。
有线格式序列化或反序列化
SDO 的一个重要用途是将应用程序数据序列化或反序列化为数据格式on the wire(这wire format) 来获取各种绑定配置。 SCA 运行时环境将缺省 HelperContext 与其注册的模式定义一起用于执行此序列化或反序列化。 此过程是关于在客户机或实施使用 SDO 数据绑定时序列化或反序列化 SCA 服务接口的输入自变量值和返回值。
自顶向下和自底向上式开发
在 SCA 应用程序中,自顶向下(从 WSDL 和 XSD 文件开始)和自底向上(从 Java 文件开始)方法可以与 SDO 一起使用。 此部分简要说明三种不同的使用模式。 您可以将所有三个模式的方面组合在单个应用程序中。
- 自顶向下,强输入
在此使用模式中,从组合定义文件开始,该文件将
<interface.wsdl>元素用于描述组件服务接口;例如:<service …> <interface.wsdl …> Refers to WSDL with updateAccountdoc-lit 封装的 WSDL 和 XSD 定义使用特定类型,而不是
xsd:anyType:<element name=updateAccount
> <complexType> <sequence> <element name=person
type=p:Person
/>此定义映射到 Java 方法;例如:
void updateAccount(DataObject person)凭借此使用模式,您可以编写 Java 代码,该代码可以复用,甚至稍后用于
p:Person之外的类型。 您可能还可以将同一动态输入的 Java 代码复用于多个强输入接口,而不必重新生成任何 Java 代码。您还可以编写 Java 代码以便 SDO 使用与特定 XSD 类型紧密结合。 而且,您可以将紧密结合且动态输入的编程样式混合在同一 SCA Java 应用程序中。
- 自顶向下,弱输入
在此使用模式中,从组合定义文件开始,其使用
<interface.wsdl>元素;例如:<service …> <interface.wsdl …> Refers to WSDL with updateAccountdoc-lit 封装的 WSDL 和 XSD 定义使用
xsd:anyType:<element name=updateAccount
> <complexType> <sequence> <element name=arg0
type=xsd:anyType
/>此定义映射到 Java 方法;例如:
void updateAccount(DataObject arg0)此使用模式类似自顶向下,强输入。 凭借自顶向下、弱输入使用模式,WSDL 和 XSD 文件映射到同等 Java 代码。 但是,您可能编写 Java 代码以使其可以处理任何类型的数据,与自顶向下强输入的使用模式相反,在此模式中,您预期特定类型,即使您通过动态 SDO API 来使用它也是一样。
- 自底向上
在此使用模式中,您以 Java 接口方法开始,例如:
void updateAccount(DataObject arg0)该方法映射到 WSDL 或 XSD 定义,例如:
<element name=updateAccount
> <complexType> <sequence> <element name=arg0
type=xsd:anyType
/>根据绑定,您可能查看或直接使用 Java 对象映射到的 WSDL 和 XSD 文件。 从 Java 映射到 XSD 时,SCA 运行时环境将
commonj.sdo.DataObject映射到xsd:anyType。您不能将
java.lang.Object用作动态、常规接口方法参数或返回类型,来代替commonj.sdo.DataObject。 SCA 运行时环境依靠方法类型的内省来表示它使用 SDO(而不是 JAXB)来处理此类型;例如,在线上反序列化数据时构造自变量值。
在每个使用模式中,您可以在单个操作内混合样式。 例如,假设您有以下 doc-lit 封装的 WSDL 定义:
<element name=updateAccount
>
<complexType>
<sequence>
<element name=arg0
type=xsd:anyType
/>
<element name=id
type=xsd:string
/>WSDL 定义映射到以下 Java 方法:
void updateAccount(DataObject arg0, String id)arg0 字段由 DataObject 动态输入,而 id 字段由 String 静态输入。
模式注册
SCA 运行时环境提供机制向 SCA 应用程序的缺省 HelperContext 注册来自 SCA 应用程序的模式定义(例如,在以您应用程序封装的 WSDL 和 XSD 文件中)。 封装在可部署组合添加到的同一添加 Java 归档 (JAR) 文件内的所有模式定义都向该可部署组合的缺省 HelperContext 注册。
模式注册很重要,因为它影响您应用程序 SDO 编程模型的准确详细信息。 例如,DataFactory.create() 方法可以用于创建在运行时环境中注册的相应模式定义的 DataObject 实例,而不必引用或装入包含应用程序代码中这些模式定义的 XSD 文件。
接口定义和编程的某些样式产生未知类型的 DataObject 实例。 在 SDO 类型系统内,此类对象的 XSD 类型是 xsd:anyType 的 SDO 同等项。 根据实例是已知、特定类型或等同 anyType,方法可能返回不同值。
例如,如下的 SDO API 调用可能根据对象实例是否在 SDO 类型系统中识别为注册的 XSD 类型的实例而返回不同结果。 对于以下调用,get(int propertyIndex) 为 xsd:anyType 返回列表:
dataObjectInstance.get(1);以下调用为 xsd:anyType 返回空列表:
dataObjectInstance.getType().getDeclaredProperties();共享作用域
只有基于 OSOA 规范的应用程序支持共享作用域。
SCA 添加支持可以使用添加导入和导出机制来便捷地封装多个 SCA 应用程序组合使用的 WSDL 和 XSD 定义文件。 普通 WSDL 和 XSD 文件可以封装到单个添加 JAR 文件,这类似共享库。
SDO 数据绑定功能通过使您可以为 SDO 类型确定共享作用域 (HelperContext) 来进一步使用 SCA 添加支持。 这减少从跨应用程序使用的大型 WSDL 和 XSD 文件装入模式定义以及从其中构造相应的 SDO 类型定义所涉及的内存占用量。
共享作用域维持在业务级应用程序级别。 对于任何业务级应用程序,对此 SDO 类型的所有引用对应于来自从共享添加导入的 XSD 或 WSDL 文件的模式定义,这些引用解析为单个作用域 (HelperContext) 中的单个 SDO 类型实例。
对于共享作用域,有两个限制:
基于 JAX-WS 的编程模型
在产品中,WSDL 操作与 Java 方法之间的映射由 JAX-WS 定义。 在该操作级别映射内,这是特定 XSD 类型与特定数据绑定(在此情况下为 SDO,而不是 JAXB)定义的相应 Java 参数类型之间的映射。 除了类型映射,编程模型独立于对数据绑定的选择。
此功能的一个后果是 JAX-WS 注解(例如 @RequestWrapper、@ResponseWrapper、@WebParam、@WebResult)在使用 SDO 的 SCA 应用程序中很重要。
另一重要后果是该产品使用 JAX-WS 来定义在 Java 客户机和实施中发生的 Java 异常与线上序列化的故障 Bean 之间的映射。 因而,故障 Bean 可能是 SDO(类型为 commonj.sdo.DataObject)。 在此情况下,SDO 用于在故障 Bean 与有线格式之间进行序列化或反序列化。