基于契约优先开发用户管理小功能–实现wsdl
1、编写schema
<?xml version="1.0" encoding="UTF-8"?>
<!--
默认的命名空间,就是xmlns,没有后追, 只能有一个。
-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/user"
xmlns:tns="http://www.example.org/user"
elementFormDefault="qualified">
<!-- User (username nickname password)
使用百叶窗方式, 只有一个根节点。
-->
<xsd:element name="user" type="tns:userType"></xsd:element>
<!-- 方法: add delete login list -->
<xsd:element name="add" type="tns:addType"></xsd:element>
<xsd:element name="addResponse" type="tns:addResponseType"></xsd:element>
<xsd:element name="delete" type="tns:deleteType"></xsd:element>
<xsd:element name="deleteResponse" type="tns:deleteResponseType"></xsd:element>
<xsd:element name="login" type="tns:loginType"></xsd:element>
<xsd:element name="logResponse" type="tns:loginResponseType"></xsd:element>
<xsd:element name="list" type="tns:listType"></xsd:element>
<xsd:element name="listResponse" type="tns:listResponseType"></xsd:element>
<xsd:complexType name="addType">
<xsd:sequence>
<xsd:element name="user" type="tns:userType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="addResponseType">
<xsd:sequence>
<xsd:element name="addResponse" type="xsd:boolean"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="deleteType">
<xsd:sequence>
<xsd:element name="username" type="tns:usernameType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="deleteResponseType">
<xsd:sequence>
<xsd:element name="deleteResponse" type="xsd:boolean"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="loginType">
<xsd:sequence>
<xsd:element name="username" type="tns:usernameType"></xsd:element>
<xsd:element name="password" type="tns:passwordType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="loginResponseType">
<xsd:sequence>
<xsd:element name="loginResponse" type="xsd:boolean"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="listType">
<xsd:sequence>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="listResponseType">
<xsd:sequence >
<!-- 返回的是User对象。 -->
<xsd:element name="listResponse" type="tns:userType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<!-- (username nickname password) -->
<xsd:complexType name="userType">
<xsd:sequence>
<xsd:element name="username" type="tns:usernameType"></xsd:element>
<xsd:element name="nickname" type="xsd:string"></xsd:element>
<xsd:element name="password" type="tns:passwordType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="usernameType">
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"></xsd:minLength>
</xsd:restriction>
</xsd:simpleType>
<!-- 使用simpleType 限制密码的长度 -->
<xsd:simpleType name="passwordType">
<xsd:restriction base="xsd:string">
<xsd:minLength value="6"></xsd:minLength>
<xsd:maxLength value="30"></xsd:maxLength>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
2、编写wsdl
2.1、schema的引用
2.1.1、使用include 的引用
<wsdl:types>
<xsd:schema targetNamespace="http://service.chb.com/">
<xsd:include schemaLocation="user.xsd"></xsd:include>
</xsd:schema>
</wsdl:types>
2.1.1、使用import的引用,可以在import中设置命名空间。
<wsdl:types>
<xsd:schema >
<xsd:import schemaLocation="user.xsd" namespace="http://service.chb.com/" ></xsd:import>
</xsd:schema>
</wsdl:types>
2.2、设置message
<wsdl:message name="add">
<wsdl:part element="tns:add" name="parameters"/>
</wsdl:message>
<wsdl:message name="addResponse">
<wsdl:part element="tns:addResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="delete">
<wsdl:part element="tns:delete" name="parameters"/>
</wsdl:message>
<wsdl:message name="deleteResponse">
<wsdl:part element="tns:deleteResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="login">
<wsdl:part element="tns:login" name="parameters"/>
</wsdl:message>
<wsdl:message name="loginResponse">
<wsdl:part element="tns:loginResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="list">
<wsdl:part element="tns:list" name="parameters"/>
</wsdl:message>
<wsdl:message name="listResponse">
<wsdl:part element="tns:listResponse" name="parameters"/>
</wsdl:message>
2.3、设置port’Type, 也就是方法
2.3.1、修改service的名称
name="user"
改为
name="UserService"
2.3.2、设置portType
<!-- 接口 -->
<wsdl:portType name="IUserService">
<!-- 设置方法, operation就是方法。 -->
<wsdl:operation name="add">
<wsdl:input message="tns:add"/>
<wsdl:output message="tns:addResponse"/>
</wsdl:operation>
<wsdl:operation name="delete">
<wsdl:input message="tns:delete"/>
<wsdl:output message="tns:deleteResponse"/>
</wsdl:operation>
<wsdl:operation name="login">
<wsdl:input message="tns:login"/>
<wsdl:output message="tns:loginResponse"/>
</wsdl:operation>
<wsdl:operation name="list">
<wsdl:input message="tns:list"/>
<wsdl:output message="tns:listResponse"/>
</wsdl:operation>
</wsdl:portType>
2.4、binding
2.5 service
<!-- service -->
<wsdl:service name="UserService">
<wsdl:port binding="tns:userServiceSOAP" name="UserServicePort">
<soap:address location="http://localhost:9990/us/"/>
</wsdl:port>
</wsdl:service>
至此, wsdl已经完成,
契约已经定好, 通过定制好的wsdl生成, java文件
G:\JavaWeb\qyyx_01\WebContent\WEB-INF\wsdl>wsimport -d G:\JavaWeb\qyyx_01\src -keep -verbose user.wsdl
服务端
客户端,使用http://localhost:9999/us?wsdl导文件(注意: 使用的是wsdlurl, 而不是wsdl文件。
G:\JavaWeb\qyyx_01\WebContent\WEB-INF\wsdl>wsimport -d G:\JavaWeb\qyyx_01_client\src -verbose -keep http://localhost:9999/us?wsdl
2.6、问题, 测试客户端时候发现, list方法报错, 无法将User 对象转化为List<User>的错误,
查看IUserService中的list方法返回值,是User, 而不是List<User>
这是wsdl文件的listResponse类型有问题。
public User list();
listResponse类型有问题。
<xsd:complexType name="listResponseType">
<xsd:sequence >
<!-- 返回的是User对象。 -->
<xsd:element name="listResponse" type="tns:userType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
解决:minOccurs=”0” maxOccurs=”unbounded”限定。
<xsd:complexType name="listResponseType">
<!-- 返回的是List<User>对象。 -->
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="listResponse" type="tns:user"></xsd:element>
</xsd:sequence>
</xsd:complexType>
客户端测试
package com.chb.service.client;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import com.chb.service.IUserService;
import com.chb.service.User;
import com.chb.service.UserService;
/**
* wsimport -d G:\JavaWeb\qyyx_01_client\src -verbose -keep http://localhost:9999/us?wsdl
*/
public class MyClient {
public static void main(String[] args) throws MalformedURLException {
//创建访问的URL
URL url = new URL("http://localhost:9999/us?wsdl");
QName qName = new QName("http://service.chb.com/", "UserService");
UserService msis = new UserService(url, qName);
//获取IMyService, 简单多了
IUserService iMyService = msis.getUserservicePort();
User user = new User();
user.setUsername("wx");
user.setNickname("wuxin");
user.setPassword("111");
iMyService.add(user);
for (User u : iMyService.list()) {
System.out.println(u);
}
System.out.println(iMyService.login("chb", "123456"));
}
}