生活中我们会遇到许许多多的奇葩问题,而这些问题又是我们不得不解决的。

  我先用一段代码来引出我想要说的内容:

import javax.jws.WebMethod;
import javax.jws.WebService;/*** Created by 30721 on 2018/9/28.*/
@WebService
public interface WstwoInter {@WebMethodString getInfo(String xml);
}

import cn.cy.webservice.inter.WstwoInter;
import org.springframework.stereotype.Component;/*** Created by 30721 on 2018/9/28.*/
@Component
public class WstwoImpl implements WstwoInter {@Overridepublic String getInfo(String xml) {System.out.println(xml);return xml;}
}

而如果用org.apache.axis.client.Call类来调用就要这样写:

public static void main(String[] args) {try {String url = "http://127.0.0.1:8002/cxf/service/webtwo?wsdl";Service service = new Service();Call call = (Call) service.createCall();call.setTargetEndpointAddress(url);QName qName = new QName("http://inter.webservice.cy.cn/", "getInfo");call.setOperationName(qName);// WSDL里面描述的接口名称QName qname = new QName("arg0");call.addParameter(qname, XMLType.XSD_STRING, ParameterMode.IN);// 接口的参数call.setReturnType(XMLType.XSD_STRING);// 设置返回类型String temp = "测试人员";String result = (String) call.invoke(new Object[] { temp });              // 给方法传递参数,并且调用方法System.out.println("result is " + result);} catch (Exception e) {e.printStackTrace();}}

描述wsdl中的方法需要带上命名空间(我这边的webservice的命名空间为:http://inter.webservice.cy.cn/)

如果使用则会报如下的错误:

org.apache.axis.AxisFault: Unexpected wrapper element getInfo found.   Expected {http://inter.webservice.cy.cn/}getInfo.at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1776)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2964)at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:504)at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327)at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:796)at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144)at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)at org.apache.axis.client.Call.invokeEngine(Call.java:2784)at org.apache.axis.client.Call.invoke(Call.java:2767)at org.apache.axis.client.Call.invoke(Call.java:2443)at org.apache.axis.client.Call.invoke(Call.java:2366)at org.apache.axis.client.Call.invoke(Call.java:1812)at cn.cy.core.Main.main(Main.java:31)
AxisFaultfaultCode: {http://schemas.xmlsoap.org/soap/envelope/}Client
 faultSubcode: faultString: Unexpected wrapper element getInfo found.   Expected {http://inter.webservice.cy.cn/}getInfo.
 faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/}stackTrace:Unexpected wrapper element getInfo found.   Expected {http://inter.webservice.cy.cn/}getInfo.at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1776)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2964)at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:504)at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327)at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:796)at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144)at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)at org.apache.axis.client.Call.invokeEngine(Call.java:2784)at org.apache.axis.client.Call.invoke(Call.java:2767)at org.apache.axis.client.Call.invoke(Call.java:2443)at org.apache.axis.client.Call.invoke(Call.java:2366)at org.apache.axis.client.Call.invoke(Call.java:1812)at cn.cy.core.Main.main(Main.java:31){http://xml.apache.org/axis/}hostname:DESKTOP-MPUGA9U

Unexpected wrapper element getInfo found.   Expected {http://inter.webservice.cy.cn/}getInfo.at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1776)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2964)at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:504)at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327)at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:796)at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144)at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)at org.apache.axis.client.Call.invokeEngine(Call.java:2784)at org.apache.axis.client.Call.invoke(Call.java:2767)at org.apache.axis.client.Call.invoke(Call.java:2443)at org.apache.axis.client.Call.invoke(Call.java:2366)at org.apache.axis.client.Call.invoke(Call.java:1812)at cn.cy.core.Main.main(Main.java:31)

View Code

正常情况下接口交接都是服务端的服务写好了,然后客户端是直接根据写好的服务进行调用测试,然而我并非这样子的,与我交接的公司的接口平台是现成的,而且是老系统没有源码无法做修改。

这就很尴尬了,没办法只能服务端代码改了,不过工作量不大还好,他们发编译老系统的代码后给我发了一段这样的客户端代码:

String url = "http://127.0.0.1:8002/cxf/service/webtwo?wsdl";Service service = new Service();Call call = (Call) service.createCall();call.setTargetEndpointAddress(url);QName qName = new QName("http://inter.webservice.cy.cn/", "getInfo");call.setOperationName(qName);// WSDL里面描述的接口名称QName qname = new QName("http://inter.webservice.cy.cn/", "arg0");call.addParameter(qname, XMLType.XSD_STRING, ParameterMode.IN);// 接口的参数call.setReturnType(XMLType.XSD_STRING);// 设置返回类型String temp = "测试人员";String result = (String) call.invoke(new Object[] { temp });              // 给方法传递参数,并且调用方法System.out.println("result is " + result);

View Code

我看了一下代码发现与上面代码的区别就是参数那边也要带上命名空间地址。那么服务端的接口就需要这样改:

@WebService(targetNamespace="http://inter.webservice.cy.cn/")
public interface WstwoInter {@WebMethodString getInfo(@WebParam(targetNamespace="http://inter.webservice.cy.cn/") String xml);
}

View Code

这都是小问题,但是大问题出现了,服务发上去他们还是调用不到,发现还少了一个参数call.setUseSOAPAction(true);call.setSOAPActionURI(actionURI);这个参数者对应着@WebMethod(action=actionURI)
这个注释。代码:

@WebService(targetNamespace="http://inter.webservice.cy.cn/")
public interface WstwoInter {@WebMethod(action="getInfo")String getInfo(@WebParam(targetNamespace="http://inter.webservice.cy.cn/") String xml);
}

View Code

但是问题并非出在这个注释,而是出在老系统调用这个actionURI的时候竟然是带IP的,这样就让服务端的代码移植性变的非常差。测试环境和生产环境必然是两个不同的服务器不同的IP,不可能每次都修改代码上的注解

@WebMethod(action="http://ip/xxx")ip,不现实。这时他们又说了接口平台的另一个调用方式。不使用命名空间。代码如下:

public static void main(String[] args) {try {String url = "http://127.0.0.1:8002/cxf/service/webtwo?wsdl";Service service = new Service();Call call = (Call) service.createCall();call.setUseSOAPAction(true);call.setTargetEndpointAddress(url);QName qName = new QName("getInfo");call.setOperationName(qName);// WSDL里面描述的接口名称QName qname = new QName("arg0");call.addParameter(qname, XMLType.XSD_STRING, ParameterMode.IN);// 接口的参数call.setSOAPActionURI("getInfo");call.setReturnType(XMLType.XSD_STRING);// 设置返回类型String temp = "测试人员";String result = (String) call.invoke(new Object[] { temp });              // 给方法传递参数,并且调用方法System.out.println("result is " + result);} catch (Exception e) {e.printStackTrace();}}

View Code

这段代码少了命名空间,多了一个actionURI,但是这个URI跟上面的不同,这个URI带的是方法名,没办法,他们改不了,只能我们服务端来改了。我这样子改:
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC, use = SOAPBinding.Use.ENCODED)
public interface WstwoInter {@WebMethod(action="getInfo")String getInfo(String xml);
}

终于接口跟他们调通了。

如果想深入理解@SOAPBinding这个注解,可参考https://blog.csdn.net/comman1999/article/details/1967907。

转载于:https://www.cnblogs.com/saoyou/p/9775732.html

Call调用webservice接口,使用命名空间和不使用命名空间的区别相关推荐

  1. android调用web接口,Android调用webservice 接口

    以查询手机号码归属地的Web service为例,它的wsdl为 1 在Android项目中导入??Ksoap2-android jar第三方jar包?? 2 Activity代码 public cl ...

  2. VC++使用Soap ToolKit3.0调用WebService接口

    由于项目需要,需要实现VC调用WebService接口,之前没接触过这个,所以花了一天找了点资料,并自己编写了demo. 1. 首先看了Soap相关资料,见http://www.w3school.co ...

  3. cmd 调用webservice接口_c# 三种方法调用WebService接口

    1.引用*.wsdl文件 WebService服务端会提供wsdl文件,客户端通过该文件生成.cs文件以及生成.dll. 注意:若服务端只提供的了URL,在URL后面加上"?wsdl&quo ...

  4. java使用axis2调用webservice接口实例

    说明:我目前的项目环境是struts2+spring+mybatis+oracle,以下代码是java使用axis2调用webservice接口实例. import javax.xml.namespa ...

  5. java:AXIS调用webService接口,返回String类型xml,并用dom4j简单解析xml

    一.使用axis调用webService接口,返回String类型xml 1.导入axis依赖 2.直接贴代码 /*** 调用webservice接口的方法,并返回String类型的xml* @par ...

  6. 使用cxf发布webservice接口,以及调用webservice接口

    一.cxf发布webservice接口 添加maven依赖 <dependency><groupId>org.apache.cxf</groupId><art ...

  7. JAVA使用HttpClient调用webservice接口

    JAVA使用HttpClient调用webservice接口 关于HttpClient用法参考: HttpClient-4.5.2官方教程完整翻译 官方教程原文链接 HttpClient下载地址: 链 ...

  8. 调用webservice接口,数据不回滚问题

    调用webservice接口,数据不回滚问题 使用cxf+spring框架开发webservice接口,在开发一个具有保存数据的接口功能时,如果数据发生了异常,对service层无论使用了xml配置声 ...

  9. EJBCA 6 通过调用WebService接口增加用户并获取证书

    2019独角兽企业重金招聘Python工程师标准>>> 今天终于搞定通过调用WebService 接口的方式在EJBCA 中增加用户. 本项目完整代码请参见http://git.os ...

  10. python调用webservice接口实例_python调用各种接口,webservice,c接口,com接口,socket协议方法...

    python调用webservice接口(SOAP) (2)调用示例: 需要先安装suds库:pip install suds from suds.client import Client #如果需要 ...

最新文章

  1. [转]MySQL innodb buffer pool
  2. html 文件路径 d files,tmpfiles.d
  3. JdbcTemplate中的query方法(代码)
  4. 用Python实现二叉树的遍历
  5. mysql 返回随机行_从mysql数据库返回随机行而不使用rand()
  6. 最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)
  7. JQuery的 serializeObject 序列化form表单
  8. 行程编码(atoi函数)
  9. utilities(matlab)—— minFunc
  10. 如何使用Movavi Video Editor编辑婚礼影片?
  11. 如何使用计算机蓝牙设备管理器,电脑设备管理器连接蓝牙的方法
  12. 微信公众号调用腾讯地图api
  13. 数据库管理系统的基本组成
  14. 美股世界/汇财证券开户说明(viewtrade)
  15. erlang安装没有bin文件夹
  16. 物联网技术周报第 103 期: DIY 智能音箱:基于 Raspberry Pi + Snowboy + AVS
  17. IC在測試生產過程的靜電放電(ESD)擊傷及電性過壓(EOS)現象
  18. Android--CoordinatorLayout源码分析及NestedScrolling机制
  19. ctfshow-命令执行-web37
  20. Java打印机如何加快打印速度_如何提升打印机打印速度

热门文章

  1. Windows 查看所有进程命令tasklist
  2. SpringBoot JWT工具类完整代码
  3. Linux CentOS 6.x 关闭图形化界面的方法
  4. spring boot通过命令行配置属性
  5. C语言检测大气成分,自动化结构健康监测
  6. ppt拖动就复制_学会这3个PPT技巧和29个快捷键!让你的PPT脱颖而出,领导叫好
  7. 协方差、相关系数---通俗解释
  8. Fleury (弗罗莱) 算法通俗解释
  9. MySQL五大约束详解(我有多详细只有我知道小白都能懂哦)
  10. JDK,JRE和JVM三者的关系以及java的运行机制,环境变量,三大版本,特点