为了演示注解@WebResult如何工作,下面的例子是基于前面例子:ch01.ts.TimeServer SEI修改的另一个新版本。
例:使用了注解的TimeServer服务
package ch01.ts;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
/**
* 服务端点接口定义(SEI)
* @author fuhd
*/
@WebService
@SOAPBinding(style = Style.RPC)
public interface TimeServer {
@WebMethod
@WebResult(partName = "time_response")
String getTimeAsString();
@WebMethod
@WebResult(partName = "time_response")
long getTimeAsElased();
}
两个服务操作方法中均添加了@WebResult注解。在产生的WSDL文档中,message元素反映了这个变化:
<message name="getTimeAsString"/>
<message name="getTimeAsStringResponse">
<part name="time_response" type="xsd:string"/>
</message>
<message name="getTimeAsElased"/>
<message name="getTimeAsElasedResponse">
<part name="time_response" type="xsd:long"/>
</message>
没有添加@WebResult注解之前,WSDL文档中,message元素是这样的:
<message name="getTimeAsString"/>
<message name="getTimeAsStringResponse">
<part name="return" type="xsd:string"/>
</message>
<message name="getTimeAsElased"/>
<message name="getTimeAsElasedResponse">
<part name="return" type="xsd:long"/>
</message>
两个message元素对比,我们可以看出,return标签被换成了time_response,也就是@WebResult注解定义的。在从web服务返回的SOAP消息中也同样反映出了这点变化,以调用getTimeAsString服务方法为例:
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getTimeAsStringResponse xmlns:ns2="http://ts.ch01/">
<time_response>Mon Mar 17 10:41:13 CST 2014</time_response>
</ns2:getTimeAsStringResponse>
</S:Body>
</S:Envelope>
没有添加@WebResult注解时,SOAP消息返回是这样的:
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getTimeAsStringResponse xmlns:ns2="http://ts.ch01/">
<return>Mon Mar 17 10:46:30 CST 2014</return>
</ns2:getTimeAsStringResponse>
</S:Body>
</S:Envelope>
从SOAP消息对比中,我们也可以看到,return标签也相应地被替换成了time_response标签。假设我们只对getTimeAsString增加@WebResult注解,那么返回的SOAP消息中针对该服务操作使用time_response标签,而针对getTimeAsElapsed服务操作所返回的SOAP消息中仍然使用默认的return标签。
在java中,提供了许多注解来决定生成的WSDL文档以什么样的格式展现。我们后面将通过简单的篇幅来介绍这些注解。除一些特殊目的的外,我们可以很容易地简化对注解的使用。在WSDL和SOAP消息中,无论是用到了time_response标签还是return标签,TimeServer的正确运行都不受影响。