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中国
作者
相关推荐
-
Java Web服务: CXF性能比较
Apache CXF Web服务栈建立在与本系列早期文章讨论的Apache Axis2及Metro栈相同的一些技术的基础之上。与Axis2类似,它使用 Apache WSS4J WS-Security 实现。
-
Java Web服务:通过CXF使用WS-Security
Apache CXF支持使用WS-Security SOAP扩展技术提供一整套用于消息交换的与安全相关的功能。CXF也使用WS-SecurityPolicy配置WS-Security,具体是怎么操作的呢?
-
CXF开源架构将SOAP工具包与Celtix ESB合并(下)
本文下半部分是对CXF架构,当然还有对应SOA类型发展的FUSE的一些要求。关注点分离:CXF提供一个完整的应用系统的各种组件之间的完全隔离……
-
CXF开源架构将SOAP工具包与Celtix ESB合并(上)
现今快速发展的时代,CXF在开放源代码发展项目的演变过程中的历史非常值得学习。Xfire项目,设计的初衷是作为高性能XML模式的基础上的……