在 Web服务中使用 SDO 动态数据 API(三)

日期: 2007-12-13 来源:TechTarget中国

  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

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • SAP收购CallidusCloud 与Salesforce竞争

    一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]

  • 事件驱动框架和SOA在空军的应用

    空军正在利用SOA来改善数据共享,并实时跟踪战机,美国空军机动司令部的Michael Marek解释了企业可从中学习的经验。

  • 揭秘New Relic APM技术细节

    New Relic应性能管理(APM)套件主要用于Web软件开发。它允许用户在面向服务的架构(SOA)上跟踪关键事务性能,并且支持代码级别的可见性来评估特定代码段和SQL语句对性能的影响

  • 仅凭SOA和云无法解决业务数据管理风险问题

    SOA和云可以是某些恼人问题高效的解决方案;这一点我们已经知道了。但是也要记住它们并不是所有事情的直接答案,特别是当你的问题是业务数据管理风险,而不是技术问题时。