参考文章:http://tomee.apache.org/examples-trunk/webservice-holder/README.html
在一次soap请求中可能会要求返回多个值,但是java只能返回一个对象,因此javax.xml.ws.Holder的出现就是为了解决这个问题,Holder只是一个简单的包装类,可以当作参数传递到webservice的方法中,客户端在请求期间发送Holder的值随后服务端将Holder的值当作输出参数返回。
接口
package com.gjb; import javax.jws.WebService; import javax.xml.ws.Holder; @WebService public interface HelloI { public String hehe(int a, int b, Holder<Integer> add, Holder<Integer> minus); }
实现类
package com.gjb; import javax.jws.WebParam; import javax.jws.WebParam.Mode; import javax.jws.WebService; import javax.xml.ws.Endpoint; import javax.xml.ws.Holder; @WebService(endpointInterface = "com.gjb.HelloI") public class Hello implements HelloI { @Override public String hehe(int a, int b, @WebParam(mode = Mode.OUT) Holder<Integer> add, @WebParam(mode = Mode.OUT) Holder<Integer> minus) { add.value = a + b; minus.value = a - b; return "测试完成"; } public static void main(String[] args) { Endpoint.publish("http://localhost:8888/gjb", new Hello()); } }
holder必须要配合webparam注释的mode使用,关于这个注释,请看我的另外一篇文章webservice注释。
为了方便,实现类带了一个main方法,执行后可以发布这个服务。接着我们用wsimport命令生成客户端java文件,然后用这些文件去调用我们刚刚发布的服务。
Client类的代码如下
package com.gjb; import javax.xml.ws.Holder; public class Client { public static void main(String[] args) { HelloService hs = new HelloService(); HelloI hi = hs.getHelloPort(); Holder<Integer> a = new Holder<Integer>(); Holder<Integer> b = new Holder<Integer>(); System.out.println(hi.hehe(5, 1, a, b)); System.out.println(a.value); System.out.println(b.value); } }
最终输出结果如下
测试完成 6 4
wsdl文件中类型定义的内容如下
<xs:schema xmlns:tns="http://gjb.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://gjb.com/"> <xs:element name="hehe" type="tns:hehe"/> <xs:element name="heheResponse" type="tns:heheResponse"/> <xs:complexType name="hehe"> <xs:sequence> <xs:element name="arg0" type="xs:int"/> <xs:element name="arg1" type="xs:int"/> <xs:element name="arg2" type="xs:int" minOccurs="0"/> <xs:element name="arg3" type="xs:int" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="heheResponse"> <xs:sequence> <xs:element name="arg2" type="xs:int" minOccurs="0"/> <xs:element name="arg3" type="xs:int" minOccurs="0"/> <xs:element name="return" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:schema>
可以看到返回值有三个,而不是一个。
利用TCPMon这个工具,我们可以看到soap的具体内容
这是请求soap
POST /gjb HTTP/1.1 Accept: text/xml, multipart/related Content-Type: text/xml; charset=utf-8 SOAPAction: "" User-Agent: JAX-WS RI 2.2.4-b01 Host: 127.0.0.1:7777 Connection: keep-alive Content-Length: 193 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:hehe xmlns:ns2="http://gjb.com/"> <arg0>5</arg0> <arg1>1</arg1> </ns2:hehe> </S:Body> </S:Envelope>
这是响应soap
HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: text/xml;charset="utf-8" <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:heheResponse xmlns:ns2="http://gjb.com/"> <arg2>6</arg2> <arg3>4</arg3> <return>测试完成</return> </ns2:heheResponse> </S:Body> </S:Envelope>
版权声明:本文为博主原创文章,未经博主允许不得转载。