Code-first还是Contract-first ?

日期: 2008-09-22 作者:liang_ma 来源:TechTarget中国

  Apache CXF的出现使得Web Service技术不断地进行完善,它在现实世界里找到了很多合适的应用。由于其成熟的规范以及强大的互用性,Web Service技术现在已成为SOA的主流技术,它将被越来越多的企业接受来构建他们的应用集成设施。  

  CXF支持code-first开发和contract-first开发。然而code-first开发具有便利的特征,大多数开发人员发现它比较直接和更容易入手,当然它也有一个重大的缺点。

  原因有很多。首先,开发Web Service的一个重要方面是决定它的粒度。考虑到这样一个事实:Web Service的大多数应用是在一个真正的高层次(比如企业级)上实现SOA解决方案,粒度不能太小。相反是Java类和方法,它们往往是细粒度的,经常被设计为非常低层次的(比如类层次)。其次,Web Service暴露出语言无关的特性。从一个具体的语言(如Java)构建服务并将它通过某些工具翻译成一个语言无关的形式,这无疑将说服它不属于语言相关的特征,这样将有损于服务的互用性。最后,从设计的观点看,面向服务的原则显然不同于面向对象的设计。尽管单个的服务可以使用OO原则和技术实现,但是服务之间的交互很少使用它们。

  由于上面的原因,code-first开发将不会让你体会到面向服务开发的精神,因为用Java代码开发和用WSDL开发需要不同的思想。使用Java code-first而不用WSDL在最大程度上会保证最多可以构建一个普通的软件。这一点在设计和开发一个SOA解决方案而不是单个服务时尤其体现出来。

  比如,下面是一个利用CXF框架(这里使用的apache-cxf-2.1.2)从WSDL文件生成Java代码的例子,WSDL文件(命名为userService.wsdl)如下: 

  <?xml version=”1.0″ encoding=”UTF-8″ ?>

  - <wsdl:definitions name=”UserService”   targetNamespace=”http://server.cxf.cvicse.com/”               >

  - <wsdl:types>

  - <xs:schema attributeFormDefault=”unqualified”     elementFormDefault=”unqualified”   targetNamespace=”http://server.cxf.cvicse.com/”      >

    <xs:element name=”add” type=”tns:add” />

    <xs:element name=”addResponse” type=”tns:addResponse” />

    <xs:element name=”findAllUsers” type=”tns:findAllUsers” />

    <xs:element name=”findAllUsersResponse” type=”tns:findAllUsersResponse” />

  - <xs:complexType name=”findAllUsers”>

    <xs:sequence />

    </xs:complexType>

  - <xs:complexType name=”findAllUsersResponse”>

  - <xs:sequence>

    <xs:element maxOccurs=”unbounded” minOccurs=”0″ name=”return” type=”tns:user” />

    </xs:sequence>

    </xs:complexType>

  - <xs:complexType name=”user”>

  - <xs:sequence>

    <xs:element minOccurs=”0″ name=”first” type=”xs:string” />

    <xs:element minOccurs=”0″ name=”last” type=”xs:string” />

    </xs:sequence>

    </xs:complexType>

  - <xs:complexType name=”add”>

  - <xs:sequence>

    <xs:element minOccurs=”0″ name=”arg0″ type=”tns:user” />

    </xs:sequence>

    </xs:complexType>

  - <xs:complexType name=”addResponse”>

    <xs:sequence />

    </xs:complexType>

    </xs:schema>

    </wsdl:types>

  - <wsdl:message name=”add”>

    <wsdl:part element=”tns:add” name=”parameters” />

    </wsdl:message>
  
  - <wsdl:message name=”findAllUsers”>

    <wsdl:part element=”tns:findAllUsers” name=”parameters” />

    </wsdl:message>

  - <wsdl:message name=”findAllUsersResponse”>

    <wsdl:part element=”tns:findAllUsersResponse” name=”parameters” />

    </wsdl:message>

  - <wsdl:message name=”addResponse”>

    <wsdl:part element=”tns:addResponse” name=”parameters” />

    </wsdl:message>

  - <wsdl:portType name=”UserService”>

  - <wsdl:operation name=”findAllUsers”>

    <wsdl:input message=”tns:findAllUsers” name=”findAllUsers” />

    <wsdl:output message=”tns:findAllUsersResponse” name=”findAllUsersResponse” />

    </wsdl:operation>

  - <wsdl:operation name=”add”>

    <wsdl:input message=”tns:add” name=”add” />

    <wsdl:output message=”tns:addResponse” name=”addResponse” />

    </wsdl:operation>

    </wsdl:portType>

  - <wsdl:binding name=”UserServiceSoapBinding” type=”tns:UserService”>

    <soap:binding style=”document” transport=”http://schemas.xmlsoap.org/soap/http” />

  - <wsdl:operation name=”findAllUsers”>

    <soap:operation soapAction=”” style=”document” />

  - <wsdl:input name=”findAllUsers”>

    <soap:body use=”literal” />

    </wsdl:input>

  - <wsdl:output name=”findAllUsersResponse”>

    <soap:body use=”literal” />

    </wsdl:output>

    </wsdl:operation>

  - <wsdl:operation name=”add”>

    <soap:operation soapAction=”” style=”document” />

  - <wsdl:input name=”add”>

    <soap:body use=”literal” />

    </wsdl:input>
  
  - <wsdl:output name=”addResponse”>

    <soap:body use=”literal” />

    </wsdl:output>

    </wsdl:operation>

    </wsdl:binding>

  -  <wsdl:service name=”UserService”>

  - <wsdl:port binding=”tns:UserServiceSoapBinding” name=”UserServicePort”>

    <soap:address location=”http://localhost:9000/userService” />

    </wsdl:port>

    </wsdl:service>

    </wsdl:definitions>

  从命令行进入apache-cxf-2.1.2的bin目录,输入如下命令:

  wsdl2java userService.wsdl

  生成的java类结构如下:

  这个目录是从WSDL文件中读取的,打开UserService.java文件,如下:

  package com.cvicse.cxf.server;

  import javax.jws.WebMethod;
  import javax.jws.WebParam;
  import javax.jws.WebResult;
  import javax.jws.WebService;
  import javax.xml.bind.annotation.XmlSeeAlso;
  import javax.xml.ws.RequestWrapper;
  import javax.xml.ws.ResponseWrapper;

  /**
   * This class was generated by Apache CXF 2.1.2
   * Tue Sep 09 13:50:57 CST 2008
   * Generated source version: 2.1.2
   *
   */
 
  @WebService(targetNamespace = “http://server.cxf.cvicse.com/”, name = “UserService”)
@XmlSeeAlso({ObjectFactory.class})
public interface UserService {

    @ResponseWrapper(localName = “findAllUsersResponse”, targetNamespace =
        “http://server.cxf.cvicse.com/”, className = “com.cvicse.cxf.server.FindAllUsersResponse”)
    @RequestWrapper(localName = “findAllUsers”, targetNamespace =
        “http://server.cxf.cvicse.com/”, className = “com.cvicse.cxf.server.FindAllUsers”)
    @WebResult(name = “return”, targetNamespace = “”)
    @WebMethod
    public java.util.List<com.cvicse.cxf.server.User> findAllUsers();

    @ResponseWrapper(localName = “addResponse”, targetNamespace =
        “http://server.cxf.cvicse.com/”, className = “com.cvicse.cxf.server.AddResponse”)
    @RequestWrapper(localName = “add”, targetNamespace =
        “http://server.cxf.cvicse.com/”, className = “com.cvicse.cxf.server.Add”)
    @WebMethod
    public void add(
        @WebParam(name = “arg0″, targetNamespace = “”)
        com.cvicse.cxf.server.User arg0
    );
}

  可以看出里面含有完整的注释。可见contract-first不仅仅拥有上面所述的特征,还可以减少开发人员的工作量,这么好的事情何乐而不为?

  原文链接:http://gocom.primeton.com/blog12619_35328.htm

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

作者

liang_ma
liang_ma

相关推荐