BSTEK Development Framework2(BDF2) : 8.2.3.2.编写Endpoint

      从UserService.xsd中定义内容来看,其中有两个Element,一个是UserRequest,一个是UserResponse,根据Spring-WS的默认规范,对于以Request结尾的Element将作为Webservice服务的入参,而对于Response结尾的Element则要作为出参,所以我们即将要编写的Endpoint类中用于接受客户端请求的方法应该包含一个以UserRequest对象的入参,同时该方法还需要返回一个UserResponse对象,明确这一点之后,接下来就可以编写我们的Endpoint类了。我们的UserServiceEndpoint类源码如下:

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环境当中。