BSTEK Development Framework2(BDF2) : 8.2.6.只有一个简单类型入参的Endpoint类

       某些情况下,可能我们的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)