某些情况下,可能我们的Endpoint类的service方法只有一个简单类型的输入参数,这个时候我们就可以修改下我们的XSD,让暴露的WSDL显得更为简单易懂,还是以UserSerivce.xsd为基础,我们对其进行修改,修改后的UserService.xsd代码如下:
修改后的UserService.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" type="string"></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>
可以看到这里唯一有变化的就是名为UserRequest的Element,它变成了一个普通的String类型的element,将这个UserService.xsd配置到Spring当中,再次浏览UserService.wsdl,可以看到如下图所示的WSDL内容:

修改我们的UserServiceEndpoint类,修改后的代码如下所示:
修改后的UserServiceEndpoint源码
package ws;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.tree.BaseElement;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
@Endpoint
public class UserServiceEndpoint{
@PayloadRoot(localPart="UserRequest",namespace="http://www.bstek.com/ws")
public @ResponsePayload Element getUsers(@RequestPayload Element request){
String countStr=request.getText();
int userCount=Integer.parseInt(countStr);
Document doc=DocumentHelper.createDocument();
Element response=doc.addElement("UserResponse");
Element users=new BaseElement("users");
response.add(users);
for(int i=0;i<userCount;i++){
Element user=new BaseElement("User");
Element username=new BaseElement("username");
username.setText("user"+i);
user.add(username);
Element company=new BaseElement("companyId");
user.add(company);
users.add(user);
}
return response;
}
}
将这个Endpoint配置到Spring当中,启动SoapUI对其进行测试,可以影响的结果。
对于这个只有一个简单类型入参的Webservice,我们也可以使用其它类型的Webservice客户端工具进行调用,比如XFire,下面的代码就演示了通过XFire的Dynamic Client来调用这个只有一个简单类型入参的Webservice,代码如下:
利用XFire Dynamic Client调用目标Webservice
package test;
import java.net.URL;
import org.apache.xerces.dom.DocumentImpl;
import org.codehaus.xfire.client.Client;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class SimpleTest {
public static void main(String[] args) throws Exception{
URL url=new URL("http://localhost:8080/bdf2-test/dorado/webservice/UserService.wsdl");
Client client=new Client(url);
Object[] obj=client.invoke("User",new Object[]{"2"});
DocumentImpl doc=(DocumentImpl)obj[0];
Node node=doc.getFirstChild().getFirstChild();
NodeList list=node.getChildNodes();
for(int i=0;i<list.getLength();i++){
Node userNode=list.item(i);
System.out.println("username:"+userNode.getFirstChild().getTextContent());
}
}
}
关于XFire 的Dynamic Client大家可以去其官网了解,运行这个Main方法可以看到控制台输出的服务端返回的username信息。