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