SDO 的动态数据 API
动态 API 场景并不要求为数据模型中的对象生成类型接口、工厂类或实现类。相反,可以选择使用规范中定义的标准 SDO API 来创建数据模型的实例,以将数据传输到其他应用程序。为此,必须首先注册您的数据模型。直接将 XSD 文档传入 XSDHelper.define() 方法。注册了数据模型后,就可以使用 DataFactory 类来创建数据模型的实例。此实例与静态数据 API 创建的实例的主要区别在于,该实例类型为 commonj.sdo.DataObject 而不是表示数据对象的类型接口。这意味着,用户可以仅使用 DataObject 接口中定义的方法类获取和设置数据对象的属性,而无需使用静态 API 场景中生成的 API。
表 1 显示了如何使用静态和动态数据 API 设置和检索清单 1 中定义的 Person 类型的属性。
表 1. 静态与动态 SDO 在检索和设置属性方面的区别
Person 的属性 静态数据 API 动态数据 API
firstName Person.getFirstName() Person.setFirstName(String fname) DataObject.getString (“firstName”) DataObject.setString(“firstName”, fname)
Id Person.getId() Person.setId(int id) DataObject.getInt(“id”) DataObject.setInt(“id”, id);
使用 SDO 的动态数据 API 的 Web 服务应用程序
接下来,本文将说明如何实现使用 SDO 的动态数据 API 来传输数据的 Web 服务应用程序。对于此应用程序,创建向 Web 服务提供者发送请求的客户机,该 Web 服务提供者将随后使用 commonj.sdo.DataObject 格式的通用数据对象进行响应。客户机将随后记录数据对象中的数据,然后将此信息输出到用户。图 2 显示了此应用程序中的客户机和服务交互的简要视图。
图 2. 使用动态数据 API 的 Web 服务应用程序
Helloworld Web 服务——Web 服务提供者
以下是使用服务组件体系结构(Service Component Architecture,SCA)术语的 Web 服务提供者的情况(即“此 SCA 组合的情况”)。在 Tuscany 中,此工作是使用清单 3 中所示的 default.scdl 文件完成的。此处的 default.scdl 文件描述使用哪个数据绑定技术来支持数据传输、提供哪个服务以及定义了哪个组件。有关 SCA 组合、服务和组件的定义的更多信息,请参考 SCA 规范(请参见参考资料)。
在清单 3 中,以下代码行是 default.scdl 中与 SDO 相关的 XML 元素,作为 SCA 数据绑定技术使用:
<dbsdo:import.sdo location=”wsdl/helloworld.wsdl”/>
此代码使 SCA 运行时在 SDO 运行时中注册 helloworld.wsdl 中描述的数据模型,以便稍后在服务实现中使用 SDO 的动态数据 API,而不用担心数据模型注册的事情。
清单 3. default.scdl:描述 SCA 组合的文件
<?xml version=”1.0″ encoding=”UTF-8″?>
<composite
name=”helloworldDSDOservice”>
<dbsdo:import.sdo location=”wsdl/helloworld.wsdl”/>
<service name=”HelloWorldWebServiceDSDO”>
<interface.wsdl interface=”http://helloworld#wsdl.interface(HelloWorld)”
wsdli_wsdlLocation=”http://helloworld wsdl/helloworld.wsdl” />
<!–<interface.java interface=”helloworld.HelloWorldService”/>–>
<binding.ws endpoint=”http://helloworld#wsdl.endpoint(HelloWorldService/
HelloWorldSoapPort)”
location=”wsdl/helloworld.wsdl” uri=”HWWSSDO”/>
<reference>HelloWorldServiceDSDOComponent</reference>
</service>
<component name=”HelloWorldServiceDSDOComponent”>
<implementation.java class=”helloworld.HelloWorldImpl”/>
</component>
</composite>
接下来定义 Web 服务提供者。通常,WSDL 文件用于定义所提供的服务、输入和输出消息,以及传递到这些消息中的数据所对应的类型。清单 4 提供了代表示例服务的简单 helloworld WSDL 文件。
清单 4. helloworld.wsdl:描述服务的 WSDL 文件
<?xml version=”1.0″ encoding=”UTF-8″?>
<wsdl:definitions targetNamespace=”http://helloworld”
>
<wsdl:types>
<schema elementFormDefault=”qualified”
targetNamespace=”http://helloworld”
>
<complexType name=”Person”>
<sequence>
<element name=”firstName” type=”string”/>
<element name=”lastName” type=”string”/>
<element name=”greeting” type=”string”/>
</sequence>
</complexType>
<element name=”getGreetings”>
<complexType>
<sequence>
<element name=”name”
type=”xsd:string”/>
</sequence>
</complexType>
</element>
<element name=”getGreetingsResponse”>
<complexType>
<sequence>
<element name=”getGreetingsReturn”
type=”xsd:anyType”/>
</sequence>
</complexType>
</element>
</schema>
</wsdl:types>
<wsdl:message name=”getGreetingsRequest”>
<wsdl:part element=”tns:getGreetings” name=”parameters”/>
</wsdl:message>
<wsdl:message name=”getGreetingsResponse”>
<wsdl:part element=”tns:getGreetingsResponse”
name=”parameters”/>
</wsdl:message>
<wsdl:portType name=”HelloWorldService”>
<wsdl:operation name=”getGreetings”>
<wsdl:input message=”tns:getGreetingsRequest”
name=”getGreetingsRequest”/>
<wsdl:output message=”tns:getGreetingsResponse”
name=”getGreetingsResponse”/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name=”HelloWorldSoapBinding”
type=”tns:HelloWorldService”>
<wsdlsoap:binding style=”document”
transport=”http://schemas.xmlsoap.org/soap/http”/>
<wsdl:operation name=”getGreetings”>
<wsdlsoap:operation soapAction=””/>
<wsdl:input name=”getGreetingsRequest”>
<wsdlsoap:body use=”literal”/>
</wsdl:input>
<wsdl:output name=”getGreetingsResponse”>
<wsdlsoap:body use=”literal”/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name=”HelloWorldService”>
<wsdl:port binding=”tns:HelloWorldSoapBinding”
name=”HelloWorldSoapPort”>
<wsdlsoap:address location=””/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
在清单 4 中,使用 WSDL 1.1 portType <wsdl:portType> 定义了名为 HelloWorldService 的服务接口。此服务接口包含一个名为 getGreetings 的操作。为了调用此操作,客户机将传递消息 getGreetingsRequest 并接收消息 getGreetingsResponse。消息 getGreetingsRequest 的类型定义为 xsd:string,而消息 getGreetingsResponse 的类型定义为 xsd:anyType。根据 SDO 2.1 规范中的规定,xsd:string 映射到 SDO String 类型,而 xsd:anyType 映射到 SDO DataObject 类型。表 2 表示 XSD 类型、SDO 类型和 Java 实例类之间的映射。
表 2. XSD 类型、SDO 类型和 Java 实例类之间的映射
XSD 类型 SDO 类型 Java 实例类
xsd:string String java.lang.String
xsd:anyType DataObject commonj.sdo.DataObject
清单 5 中所示的 Java 接口描述服务所提供的操作以及输入和输出,这些内容与清单 4 中的 WSDL 文档描述的 <wsdl:PortType:> 定义对应。可以使用 Apache Tuscany 的服务组件体系结构实现提供的工具由 Apache Axis 2.0 或手动生成此 Java 接口。
清单 5. helloworld.wsdl——HelloWorldService.java:描述服务的 Java 接口
package helloworld;
@Service
@Remotable
@DataType(name = “commonj.sdo.DataObject”)
public interface HelloWorldService {
public commonj.sdo.DataObject getGreetings(
java.lang.String param0) throws java.rmi.RemoteException;
}
清单 5 定义了名为 getGreetings 的单个远程服务操作,该操作接受字符串作为输入,并向客户机返回任何类型的 SDO。@DataType 是一个 Annotation,用于描述 Apache Tuscany 的 Java 方法或属性的输入和输出参数的数据绑定类型。
现在创建 Java 接口的实现,如清单 6 中所示。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
SAP收购CallidusCloud 与Salesforce竞争
一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]
-
事件驱动框架和SOA在空军的应用
空军正在利用SOA来改善数据共享,并实时跟踪战机,美国空军机动司令部的Michael Marek解释了企业可从中学习的经验。
-
揭秘New Relic APM技术细节
New Relic应性能管理(APM)套件主要用于Web软件开发。它允许用户在面向服务的架构(SOA)上跟踪关键事务性能,并且支持代码级别的可见性来评估特定代码段和SQL语句对性能的影响
-
仅凭SOA和云无法解决业务数据管理风险问题
SOA和云可以是某些恼人问题高效的解决方案;这一点我们已经知道了。但是也要记住它们并不是所有事情的直接答案,特别是当你的问题是业务数据管理风险,而不是技术问题时。