对于Spring-WS的contract-first模式来说,开发一个Webservice我们需要从定义一个XSD文件开始。我们要定义的Webservice允许用户发一个请求,当中包含请求的用户数目及用户所在的公司两个信息,Webservice服务在收到这个请求之后,会根据请求的用户数目及所在公司的ID,生成对应的用户,对于生成的用户应该包含四个信息,分别是:用户名、出生日期、性别及所在公司ID,最后Webservice服务将生成的用户集合返回给客户端。
根据上述需求,我们的XSD内容编写如下:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.bstek.com/ws" xmlns:tns="http://www.bstek.com/ws" elementFormDefault="qualified"> <element name="UserRequest"> <complexType> <all> <element name="userCount" type="int"></element> <element name="targetCompany" type="string"></element> </all> </complexType> </element> <element name="UserResponse"> <complexType> <sequence> <element name="users" maxOccurs="unbounded" type="tns:User"></element> </sequence> </complexType> </element> <complexType name="User"> <all> <element name="username" type="string"></element> <element name="birthday" type="date"></element> <element name="gender" type="boolean"></element> <element name="companyId" type="string"></element> </all> </complexType> </schema>
从上面的XSD内容来看,其中我们采用的namespace为http://www.bstek.com/ws,这个地址是虚拟的,用户在定义时可以灵活选择,在这个XSD内容当中,我们定义了一个名为User的复杂类型对象(complexType),它包含用户名、出生日期、性别及所在公司ID四个element,然后我们还定义两个element对象,分别是UserRequest及UserResponse,其中UserRequest中包含两element,分别是userCount及targetCompany,对应我们的需求就是请求的用户数目及所在公司的ID;另一个UserResponse中只有一个名为users的element,它的类型是我们自定义的User类型,且它的maxOccurs为unbounded表示这个element在UserRequest中数目不限制,对应到我们Java当中这个users是一个集合对象,一个包含User对象的集合对象(可能是一个Collection,也可能是一个数组)。
在Spring-WS当中,在定义XSD时,以Request结尾的命名的element,默认将会被认为是Webservice调用的需要的输入信息(也就是调用参数);而以Response结尾命名的element默认将会被认为是Webservice调用的需要的输出信息(也就是调用返回的结果)。对照这个规则,上述的XSD当中,UserRequest将会作为Webservice的输入参数,而UserResponse则会作为Webservice的调用结果返回。