spring是一个优雅的框架,将常用的技术粘合在一起。spring-ws相对于其他框架最大的优点是对web服务涉及技术的抽象非常的好,为webservice处理提供统一的模型,而又不限制实现时使用的技术。
发布webservice
发布webservice有以下几个步骤:
1. 编写服务接口定义,包括类型定义,服务方法定义。
2. 实现服务接口定义的方法。
3. 发布服务。
本文已一个订单服务为例
为什么契约优先
开发webservice可以定义java代码,通过框架生产wsdl/xsd内容。也可以采用契约优先方式,先定义wsdl/xsd,然后生成java代码。通过契约优先的方式有以下原因:
1. Object/XML之间的转换。对象与xml转换不能完全的匹配,xsd可以定义对象的限制,比如字符串必须是大写,而java对象没有办法定义限制。
2. java类不是可移植的类型。
3. 环形依赖。如果一个类之间相互依赖,则生成的xml会不停的嵌套。
详情可以参考《Spring Web Services Reference》
编写服务接口定义
定义数据类型,对于请求和反馈,尽量增加一个基础类,这样可以随时增加公共的内容。
xsd文件内容
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.nxmax.net/hello"
elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.nxmax.net/hello">
<complexType name="BaseRespType" abstract="true">
<sequence>
<element name="success" type="boolean" minOccurs="1"
maxOccurs="1" />
<element name="message" type="string" minOccurs="0" />
</sequence>
</complexType>
<complexType name="BaseReqType" abstract="true">
<sequence>
<element name="callerIndentifier" type="string" minOccurs="1" maxOccurs="1"></element>
</sequence>
</complexType>
<element name="CreateOrderReq">
<complexType>
<complexContent>
<extension base="tns:BaseReqType">
<sequence>
<element name="GoodCode" type="string" />
<element name="Amount" type="int" />
<element name="Remarks" type="string" minOccurs="0" />
</sequence>
</extension>
</complexContent>
</complexType>
</element>
<element name="CreateOrderResp">
<complexType>
<complexContent>
<extension base="tns:BaseRespType">
<sequence>
<element name="OrderNum" type="string" minOccurs="1"
maxOccurs="1"></element>
</sequence>
</extension>
</complexContent>
</complexType>
</element>
<element name="InquireReq">
<complexType>
<complexContent>
<extension base="tns:BaseReqType">
<sequence>
<element name="orderNum" type="string" minOccurs="1" maxOccurs="1"></element>
</sequence>
</extension>
</complexContent>
</complexType></element>
<