javax.xml.ws.Holder的使用方式

参考文章: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 add,
			Holder 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 add,
			@WebParam(mode = Mode.OUT) Holder 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 a = new Holder();
		Holder b = new Holder();
		System.out.println(hi.hehe(5, 1, a, b));
		System.out.println(a.value);
		System.out.println(b.value);
	}
}

最终输出结果如下

测试完成
6
4
wsdl文件中类型定义的内容如下




















可以看到返回值有三个,而不是一个。

利用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


   
      
         
            5
            1
         
      
   

这是响应soap

HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml;charset="utf-8"


   
      
         
            6
            4
            测试完成
         
      
   





你可能感兴趣的:(javax.xml.ws.Holder的使用方式)