参考文章: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>
分享到:
相关推荐
`javax.xml.ws`通常指的是JAX-WS,它提供了在Java中构建和使用Web服务所需的基础框架,包括服务接口、客户端代理以及WSDL生成。而`javax.jws`则与JAX-RS有关,它定义了创建RESTful服务和客户端的方法。 【压缩包子...
- `javax.xml.rpc.Holder`:用于传递双向参数,即既能作为输入参数也能作为输出参数的容器。 - `javax.xml.rpc.encoding`包:包含了编码和解码相关的类,如`Marshaller`和`Unmarshaller`,用于将Java对象序列化为XML...
在Java开发中,`javax.xml.ws.Service` 是一个核心组件,属于Java API for XML Web Services (JAX-WS)的一部分,用于创建客户端和服务端的Web服务代理。报错通常表明缺少必要的依赖包,这可能会影响到程序的正常运行...
【javax.xml.ws.Service】是Java平台上用于Web服务客户端的一个核心接口,它位于Java Web Services (JWS) API中,主要用于创建和使用Web服务。这个接口是JAX-WS(Java API for XML Web Services)规范的一部分,它...
在Java中,javax.xml.rpc包提供了相关的接口和类,使得开发者能够方便地创建和使用XML-RPC客户端和服务端。 在描述中提到的问题可能源于类路径配置不正确。当项目包含"javax.xml.rpc"相关资源但编译时仍然报错,这...
javax.xml.stream_1.0.1.v201004272200.jar
在集成阿里云移动推送时,部署到服务器的时候遇到了java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter 错误,产生原因是缺少javax.xml.bind.DatatypeConverter
在Android Studio中遇到"Unable to load class ‘javax.xml.bind.JAXBException‘"的错误,通常是由于Java运行时环境(JRE)或开发工具包(JDK)与项目的兼容性问题导致的。`javax.xml.bind.JAXBException`是Java的...
总的来说,`javax.ws` jar包的使用涉及到Java Web服务开发的核心技术,通过正确配置和理解其API,开发者可以构建高效、灵活的RESTful服务。在实际项目中,配合IDE和详细的使用说明,可以有效地避免和解决问题,提高...
javax.xml.bind.jar和三个sqljdbc4x.jar;实测可用。用于sqlserver连接和出现Java 9 及以上 eclipse 链接 SQL数据库 抛出 java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter 异常
因此,当你尝试使用JDK 10及以上版本时,可能会遇到像`javax.xml.ws.Service`这样的类找不到的问题,因为它们已经被从标准JDK中移除。 为了解决这个问题,有以下几种方法: 1. **JDK降级**:将JDK版本回退到1.8,...
赠送jar包:javax.ws.rs-api-2.0.1.jar; 赠送原API文档:javax.ws.rs-api-2.0.1-javadoc.jar; 赠送源代码:javax.ws.rs-api-2.0.1-sources.jar; 赠送Maven依赖信息文件:javax.ws.rs-api-2.0.1.pom; 包含翻译后...
在Java中,`javax.ws` 包提供了一种内置的方式来实现Web服务,使得开发者可以方便地创建和消费Web服务。本篇文章将深入探讨Java自带的Web服务实现方式,主要涉及`javax.ws`的相关知识点。 ### 1. Web服务基础 Web...
《深入解析javax.xml-1.3.4》 在Java编程领域,`javax.xml`是核心的XML处理包,主要用于处理XML文档的解析、转换、验证等任务。`javax.xml-1.3.4`是这个包的一个特定版本,包含了处理XML所需的一系列类和接口。本文...
Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty...javax.xml.rpc.handler.MessageContext.class
赠送jar包:javax.ws.rs-api-2.0.jar; 赠送原API文档:javax.ws.rs-api-2.0-javadoc.jar; 赠送源代码:javax.ws.rs-api-2.0-sources.jar; 赠送Maven依赖信息文件:javax.ws.rs-api-2.0.pom; 包含翻译后的API文档...
jar包,官方版本,自测可用