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<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文件,然后用这些文件去调用我们刚刚发布的服务。

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

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>


 




版权声明:本文为博主原创文章,未经博主允许不得转载。

 

你可能感兴趣的:(java)