扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Fuhwei Lwo 来源:论坛整理 2007年11月26日
关键字: 软件
动态 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"/> |
清单 3. default.scdl:描述 SCA 组合的文件
<?xml version="1.0" encoding="UTF-8"?> <composite xmlns="http://www.osoa.org/xmlns/sca/1.0" xmlns:wsdli="http://www.w3.org/2006/01/wsdl-instance" xmlns:dbsdo="http://incubator.apache.org/tuscany/xmlns/ databinding/sdo/1.0-incubator-M2" 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" xmlns:tns="http://helloworld"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd=http://www.w3.org/2001/XMLSchema name="helloworld">
<wsdl:types>
<schema elementFormDefault="qualified"
targetNamespace="http://helloworld"
xmlns="http://www.w3.org/2001/XMLSchema">
<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
表 2. XSD 类型、SDO 类型和 Java 实例类之间的映射
XSD 类型 | SDO 类型 | Java 实例类 |
xsd:string | String | java.lang.String |
xsd:anyType | DataObject | commonj.sdo.DataObject |
清单 5 中所示的 Java 接口描述服务所提供的操作以及输入和输出,这些内容与清单 4 中的 WSDL 文档描述的
清单 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 中所示。
清单 6. HelloWorldImpl.java:服务的 Java 实现
package helloworld; import java.rmi.RemoteException; import org.osoa.sca.annotations.Service; import commonj.sdo.DataObject; import commonj.sdo.helper.DataFactory; /** * This class implements the HelloWorld service. */ @Service(HelloWorldService.class) public class HelloWorldImpl implements HelloWorldService { DataFactory dataFactory = DataFactory.INSTANCE; public commonj.sdo.DataObject getGreetings(String name) throws RemoteException { DataObject person = dataFactory.create("http://helloworld", "Person"); String[] names = name.split(" "); person.setString("firstName", names[0]); person.setString("lastName", names[1]); person.setString("greeting", "Hello"); return person; } } |
清单 6 中的代码显示了 HelloWorldService 接口的实现,可允许服务使用者使用个人的全名调用 getGreetings 操作或方法。该代码预期接受包含该人的问候消息的 SDO。
在此 getGreetings(String) 方法中,将使用 DataFactory.create 方法并传入命名空间(在 WSDL 中定义)及类型的名称(在本例中为 Person)来创建新 SDO。这将创建 Person 类型的 SDO。然后使用 commonj.sdo.DataObject 提供的 API 来设置 Person 类型的属性。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者