0 0

客户端用Document_literal方式调用web service问题10

折腾好几天了,实在是没辙了,小弟水平有限,大家帮忙看看吧。

开发环境:JDK1.5.06、tomcat5.5.26、j2ee1.4、axis1.4、


通过axis将服务类发布成webService,然后写客户端进行调用

服务类代码 Doc.java:
public class Doc {
	public String say(String message,String mes2) {
		System.out.println("调用say方法了");
		String a=message+mes2;
		System.out.println(a+"------------------------");
		return a;
	}

}


此类对应在server-config.wsdd文件中的代码:
   <service name="Doc" type="" provider="java:RPC" style="document" use="literal">
   <parameter name="scope" value="Request"/>
   <parameter name="className" value="org.webservice.report.Doc"/>
   <parameter name="allowedMethods" value="*"/>
   <namespace>http://Doc</namespace>   


启动tomcat后访问webservice地址其WSDL文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://Doc" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://Doc" xmlns:intf="http://Doc" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
 <wsdl:types>
  <schema elementFormDefault="qualified" targetNamespace="http://Doc" xmlns="http://www.w3.org/2001/XMLSchema">
   <element name="message" type="xsd:string"/>
   <element name="mes2" type="xsd:string"/>
   <element name="sayReturn" type="xsd:string"/>
  </schema>
 </wsdl:types>

   <wsdl:message name="sayResponse">

      <wsdl:part element="impl:sayReturn" name="sayReturn"/>

   </wsdl:message>

   <wsdl:message name="sayRequest">

      <wsdl:part element="impl:message" name="message"/>

      <wsdl:part element="impl:mes2" name="mes2"/>

   </wsdl:message>

   <wsdl:portType name="Doc">

      <wsdl:operation name="say" parameterOrder="message mes2">

         <wsdl:input message="impl:sayRequest" name="sayRequest"/>

         <wsdl:output message="impl:sayResponse" name="sayResponse"/>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="DocSoapBinding" type="impl:Doc">

      <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="say">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="sayRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="sayResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="DocService">

      <wsdl:port binding="impl:DocSoapBinding" name="Doc">

         <wsdlsoap:address location="http://10.85.20.89:8080/s/services/Doc"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions>



客户端代码:
org.apache.axis.client.Service s = new org.apache.axis.client.Service();
Call call = (Call) s.createCall();
call.setTargetEndpointAddress(new URL("http://10.85.20.89:8080/s/services/Doc"));
call.setSOAPActionURI("");
call.setOperationName(new QName("http://Doc", "say"));
call.setProperty(Call.OPERATION_STYLE_PROPERTY, Style.DOCUMENT.getName());
call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true));

SOAPBodyElement[] input = new SOAPBodyElement[2];
input[0] = new SOAPBodyElement(XMLUtils.StringToElement("http://Doc", "say", "1111"));
input[1] = new SOAPBodyElement(XMLUtils.StringToElement("http://Doc", "say", "2222"));

Vector rtn = (Vector) call.invoke(input);

Element  result=((SOAPBodyElement)rtn.get(0));
System.out.println(result.getFirstChild().getNodeValue());


客户端返回的结果应该将传入的2个参数返回即"11112222",但是返回的结果是"1111null";
也就是说服务类只获取到了第一个参数,第二个参数没有获取到。

通过工具监听到的SOAP消息以及返回结果结果如下:

请求:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:say xmlns:ns1="http://Doc">1111</ns1:say>
<ns2:say xmlns:ns2="http://Doc">2222</ns2:say>
</soapenv:Body>
</soapenv:Envelope>

返回结果:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<sayReturn xmlns="http://Doc">1111null</sayReturn>
</soapenv:Body>
</soapenv:Envelope>


后来又用工具xmlSpy根据服务的地址自动生成SOAP请求调用服务,结果也是一样

请求:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<SOAP-ENV:Body>
		<m:message xmlns:m="http://Doc">String</m:message>
		<m:mes2 xmlns:m="http://Doc">String</m:mes2>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>



返回结果:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<soapenv:Body>
		<messageReturn xmlns="http://Doc">Stringnull</messageReturn>
	</soapenv:Body>
</soapenv:Envelope>


如果服务类对应在server-config.wsdd文件代码
由原来的 style="document" use="literal" 改为 style="rpc" use="encode"
则没有这样的问题。

如果传入的参数为一个也是没有问题的,如果是多个的话则除第一个外,其他的都为空。

在网上也找了些例子,用Document_literal方式调用web service,但是例子上的方法都是传入一个参数的,没有传多个的
难道没有人试过传多个参数的。
到一些英文网站上也有人说是JAX-RPC对Document_literal方式支持不太好,建议使用JAX-WS,但是要公司换高版本的JDK好像不太
现实。
另外就是由于要和别的系统做接口,通过wsdl来生成代码来调用的方式太笨拙了,这个就直接毙掉了。

大家帮忙看看有没好的办法,小弟在这里多谢了。





看样子是无人回答了,结贴吧,顺便说下我找到答案:
貌似是axis的问题,只要是document方式,则只能接收到一个参数,其余的参数都接收不到,
解决方法就是将方法的参数类型弄成个复杂类型,自己写一个javabean将方法参数都封装在里面
,最后在服务器端解析javabean。
但是在用JDK自带的注解将类发布为webservice就没有这样的问题,多个参数都可以接收得到。
SOA 
2010年7月14日 11:28
目前还没有答案

相关推荐

    WebServices服务接口调用---用ducument方式应用

    标题中的“WebServices服务接口调用---用document方式应用”指的是使用XML文档作为消息交换格式来调用Web服务接口的一种方法。 在Web服务中,有两种主要的消息交换模式:RPC(Remote Procedure Call)风格和...

    Android下调用webservice的客户端和服务器端详细代码

    在Android开发中,调用Web Service是常见的数据交互方式,特别是在需要与远程服务器进行通信时。Web Service是一种基于网络的、平台无关的接口,可以提供数据交换和业务逻辑执行。本示例提供了Android客户端和服务器...

    WSDL样式详解,soap中Rpc和Document的区别

    Web 服务描述语言(WSDL,Web Service Description Language)是一种XML格式,用于定义网络服务的接口,包括服务的位置、操作及如何与这些服务交互。在WSDL文档中,SOAP(Simple Object Access Protocol)绑定部分...

    webservice客户端以及服务端

    Web服务是一种基于网络的、平台无关的交互方式...客户端则使用Axis2的Document Literal风格,直接构造并发送SOAP消息,无需预先生成客户端存根。这种实现方式具有灵活性和跨平台性,使得不同系统间的通信变得更加便捷。

    Java web Service 引擎 Xfire 图文教程.docx

    最后,客户端的创建涉及到了调用Web服务。这里创建了一个测试类,使用了Xfire提供的API来创建服务的元数据和服务代理。`ObjectServiceFactory`用于创建服务模型,`XFireProxyFactory`则用来创建服务代理对象。通过...

    CXF客户端调用以及发布服务

    客户端调用远程Web服务的第一步是获取WSDL(Web Service Definition Language)文件,它定义了服务的接口和消息格式。使用CXF的`wsdl2java`工具,将WSDL文件转换为Java代码。以下是一些常用的`wsdl2java`命令行选项...

    用JAXWS实现Web Service的步骤和实例

    在客户端代码中,我们可以通过以下方式来调用Web服务的方法: ```java package com.dscomm.minhang.eoc.web.jaxws.client; public class WebServiceTest { public static void main(String[] args) { ...

    jax-ws WebService客户端与服务端工程.rar

    - **服务代理**:使用`Service`类可以生成服务代理对象,这个对象可以调用Web服务的方法。`Service`类通常通过WSDL文档来实例化。 - **@WebParam**:用于定义方法参数,可以指定参数的名称和传递方式。 - **异常...

    web service

    调用Web服务时,客户端需要使用SOAP消息与服务进行通信。Axis也提供了客户端API,使得开发者可以方便地创建这些SOAP消息,发送请求并处理响应。它支持各种传输协议,如HTTP和HTTPS,以及数据编码方式,如XML和JSON。...

    axis1.4 发布doc/lit格式Web Service

    一旦WSDL发布,客户端就可以使用它来生成代理类,进而调用我们的Web服务。 总的来说,使用Axis1.4发布doc/literal格式的Web服务涉及创建Java服务类、编写或编辑部署配置文件(如`server-config.wsdd`),并确保在...

    MyEclipse9.0开发WebService

    通过以上步骤,你已经掌握了如何在MyEclipse9.0中开发、测试和调用Web Service的基本流程。无论是本地服务还是远程服务,MyEclipse都能提供便捷的工具支持,使得Web Service的开发更加高效和直观。记得检查和理解...

    java webService 中文与英文教程

    4. 客户端API:解释如何使用CXF生成客户端代码,以便于调用Web服务。 5. 自定义行为:探讨如何扩展CXF以实现特定的功能需求,如拦截器和转换器。 总的来说,这个教程集合为学习Java WebService提供了全面的资源,...

    jdk6 开发webservice

    8. **生成客户端代码**: 使用JAX-WS,可以通过WSDL文件自动生成客户端代码,使得调用Web Service如同调用本地方法一样简单。在JDK 6中,可以使用`wsimport`工具从WSDL生成客户端所需的Java类和配置文件。 总结起来...

    Approaches and Best Practices in Web Service Style, Data Binding and Validation.pdf

    - Document/Literal Wrapped:每个操作都有一个单独的根元素,将参数包裹其中,增加了一层封装,使得消息结构更加清晰。 #### 数据抽象与松散与强类型数据 数据抽象是网络服务设计的关键,它涉及到如何在服务接口...

    JAX-WS使用教程

    JAX-WS(Java API for XML Web Services)是一种用于开发基于XML的Web服务的Java API。它是JAX-RPC的后继者,提供了一种更简洁的方式来...通过这个目录,开发者可以逐步学会如何使用JAX-WS来创建、发布和调用Web服务。

    CXF实现WebService

    总之,Apache CXF 提供了一种高效且灵活的方式来实现和使用 Web Service,使得开发者可以轻松地构建和集成分布式应用程序,尤其在云计算和微服务架构中发挥着关键作用。通过理解 Web Service 的基本概念、架构优势...

    WSDL 文件及其属性

    `document/literal`是最常见的选择,因为它提供了更好的互操作性,但需要通过`document/literal wrapped`方式解决操作名称的表示问题。 最后,我们来看看在WSDL中指定SoapAction的三种方式。SoapAction是一个HTTP头...

    delphi下和.net参数传递

    - 这些代码确保 Delphi 客户端使用 Document|Literal 编码方式与 .NET 2.0 的 WebService 通信。 4. **调用 WebService 方法**: - 在实际的业务代码中,可以通过如下方式调用 WebService 中的方法: ```pascal ...

Global site tag (gtag.js) - Google Analytics