BSTEK Development Framework2(BDF2) : 8.2.5.以XmlDOM作为出入参

       一旦采用XML的DOM作为Endpoint的service方法的出入参,那么,就不再需要编写与XSD对应的Javabean了,我们需要做的就是解析XML DOM就行,在Spring-WS当中,对于XML的DOM目前支持三种类型,分别是:jdom、dom4j以及w3c的dom,这三类型用法都是一样,只是因为API不同,所以在解析时写法也略有不同,我们推荐采用dom4j或jdom,相同它们的API写起来更为简单,我们这里将以dom4j为例,来重新之前的UserServiceEndpoint,编写好的类源码如下所示:

Dom4j版的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.element("userCount").getText();
    	int userCount=Integer.parseInt(countStr);
    	String targetCompanyId=request.element("targetCompany").getText();
    	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");
    		company.setText(targetCompanyId);
    		user.add(company);
    		users.add(user);
    	}
    	return response;
    }
}

       相比之前的UserServiceEndpoint类,这里基于Dom4j显的要复杂许多,可以看到对于入参只有一个dom4j的Element对象,这个Element实际上是请求的SOAP消息的body部分,也就是一个以<UserRequest>为根的XML,其下包含<userCount>及<targetCompany>两个XML子节点,可以看到,与我们定义的Javabean结构一模一样,只是我们需要手工解析才能取得需要的值。

       对于出参来说它也必须是一个dom4j的Element,可以看到我们创建了一个以<UserResponse>为根的xml对象,其中包含一个集合类型的<users>节点,在<users>节点下还包含若干个<User>子节点...

       将这个Endpoint配置到我们的Spring环境当中,再次利用SoapUI对其进行测试,可以得到与原UserServiceEndpoint类相同效果。