某些情况下,可能我们的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信息。
Attachments:
wsdl.png (image/png)