对于Webservice的编写,我们可能会犯错的地方应该就是入参与出参了,以上面我们编写的Webservice为例,它的入参是UserRequest对象,出参是UserResponse对象,可以看到它的入参与出参都只是一个,这并不是巧合,而是故意为之,是一种最佳实践。
对于入参,UserRequest对象包含两个属性,一个是userCount,一个是targetCompany,也就是说我们的Webservice服务类需要两个参数,但在编写Webservice的Endpoint时,我们并没发将其作为两个入参处理,而是将这两个参数以属性的形式放在一个对象当中,作为一个入参处理。这样做的好处是避免了我们手工解析RequestPayload中的XML可能会出现的错误(Spring-WS允许我们方法调用参数当中解析RequestPayload中的XML以实现多个入参),同时即使我们的服务类需要再多的其它类型的参数(或者只有一个参数),我们也可以将其作为这个UserRequest对象的一个属性处理,简单且容易理解。
可能你会遇到一种相对较为简单的入参情况,那就是这个入参只有一个值,比如只有一个String类型的值,那么对于这种情况我们又该如何处理呢?同样遵行我们一个参数的原则,将我们需要端所需要的一个参数也放在一个我们自定义的对象当中,作为这个对象的属性实现数据的传递。比如我们之前的例子当中,如果服务端只需要一个userCount参数,而不需要targetCompany参数,同样我们也需要将这个userCount参数作为一个Javabean的属性。
讨论完入参后,我们来看看出参。对于出参而言,我们同样要遵循一个参数的原则,以我们上面所举的示例来说,出参是一个UserResponse对象,它有一个集合类型的User对象属性,也就是说,它的出参实际上也是一个值,一个集合类型的值,但我们并没有将这个集合直接作为出差使用,那是因为系统无法将集合值直接序列化成SOAP的消息部分内容,所以我们将这个集合放在一个我们自定义的名为UserResponse对象当中,这样在返回值时,系统会按照UserResponse对象当中定义的Annotation将这个返回值序列化成SOAP的消息部分内容。
通过以上对入参及出参的讨论,我们总结出一个结论,我们基于Spring-WS编写的Webservice的服务端方法,无论出参还是入参都只能是一个参数,而不能是多个,同时这个参数必须是我们自己定义的且添加了相关Annotation(比如@XmlRootElement等)的Javabean,对于服务端执行业务时需要的参数(无论是一个还是多个)都放到这个自定义的Javabean中,作为这个Javabean的标准属性实现参数值的传递。