从UserService.xsd中定义内容来看,其中有两个Element,一个是UserRequest,一个是UserResponse,根据Spring-WS的默认规范,对于以Request结尾的Element将作为Webservice服务的入参,而对于Response结尾的Element则要作为出参,所以我们即将要编写的Endpoint类中用于接受客户端请求的方法应该包含一个以UserRequest对象的入参,同时该方法还需要返回一个UserResponse对象,明确这一点之后,接下来就可以编写我们的Endpoint类了。我们的UserServiceEndpoint类源码如下:
package ws; import java.util.ArrayList; import java.util.Date; import java.util.List; 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 UserResponse getUsers(@RequestPayload UserRequest request){ int userCount=request.getUserCount(); String targetCompanyId=request.getTargetCompany(); UserResponse response=new UserResponse(); List<User> users=new ArrayList<User>(); for(int i=0;i<userCount;i++){ User user=new User(); user.setBirthday(new Date()); user.setCompanyId(targetCompanyId); user.setGender(true); user.setUsername("user"+i); users.add(user); } response.setUsers(users); return response; } }
在这个UserServiceEndpoint类当中,只有一个getUsers方法,可以看到这个方法需要一个UserRequest对象作为入参,同时方法会返回一个UserResponse对象,这个类与其它Javabean不同的地方是它使用一些Spring-WS提供的Annotation,我们首先来看看标注在类名为的Endpoint。
这个名为Endpoint的annotation表示当前这个类将作为Spring-WS的一个Endpoint,它可以接收特定的用户请求,执行其中的业务方法。
在getUsers方法上有个名为@PayloadRoot的Annotation,标明当前这个getUsers方法支持Webservice以SOAP消息的XML root节点名及namespace来匹配找到该方法,比如这里定义@PayloadRoot(localPart="UserRequest",namespace="http://www.bstek.com/ws")就表示该方法支持请求Webservice的SOAP消息当中,SOAP消息body部分XML节点名为UserRequest,同时采用http://www.bstek.com/ws作为namespace的SOAP消息,一旦我们的客户端发出的SOAP消息满足上述条件就会执行这里的getUsers方法。
在这个getUsers方法的入参当中有一个UserRequest类型的参数,其前面有个名为@RequestPayload的Annotation,这就表示这个UserRequest值需要从客户端请求的SOAP消息的Body当中解析出来,解析后的Body部分的XML要反序列化成这里需要的UserRequest对象。最后在这个方法的返回值UserResponse前面我们还添加了一个名为@ResponsePayload的Annotation,表示这个返回值将作为响应的负载返回到Webservice调用客户端。
再来看看这个getUsers方法体内部,这里我们只是根据请求信息虚拟了一批用户返回,实际业务中在这个getUsers方法体内部,我们应该去调用需要执行的业务逻辑方法,从而完成Webservice与业务结合的过程。
Endpoint编写完成之后,接下来我们就可以将上述编写XSD及Endpoint类配置到Spring环境当中。