最近在做一个项目,遇到了一个奇怪的问题:webservice接口能够正常调用,但却出现了部分参数传递正确,个别参数的值丢失(null)的情况。由于以前未曾遇过,为了这个问题还折腾了几天,那个苦呀。
简单描述一下需求:
项目中有一个现网的webservice接口,原来是A厂家提供服务端,B厂家提供客户端进行调用。现在A厂家不做了,需要由我们来实现服务端。
好,开始干吧...,嗯...自己测试通过,部署到测试环境,找B厂家测试一下,好的,原来的业务流程都能正常跑通,接口上线吧...
过了几天,客户反馈有个参数为空,检查呀检查呀,哦,是接口中传递过来的某个参数为空。于是,找了B厂家进行测试确认,对方还提供了抓包,我自己也抓了包,发现该参数的确是有传递的。这就奇怪了,从未遇到过接口的参数出现丢失的问题。刚开始以为接口写得有问题,从命名空间、参数名等注解、对象数组参数的声明等进行排查,最终都无济于事。还尝试过升降cxf的版本,结果还会抛不同的异常,这回可真纳闷了...
由于B厂家一直是在现网使用当中的,未曾对接口进行改动,所以刚开始一直怀疑是自己的问题。后来实在没办法,只能找B厂家一起解决。联调工作本来不复杂,但B厂家做开发的远在异乡,还上不了网。需要测试还得发布版本让其他支撑人员部署到测试环境,再和我们进行联调。由于我们的本地网络和他们的测试环境的网络是不通的,我们又必须得部署到测试环境与他们进行测试。这个过程可真够麻烦的,效率非常非常的低,非常难排查问题。
在这个过程中,通过google了解过axis1.4似乎存在这样的问题,但资料不多。在测试的过程中也向对方了解过,他们用的的确是axis1.4。曾经想过如果使用axis1.4进行实现应该就没问题了,但问题在于从未使用过axis,一方面研究要花时间,另一方面我一直坚信这么强大的框架(cxf),即使有不兼容的地方应该也有办法解决吧。还曾想过修改cxf源代码来实现,但后来感觉还没必要走这一步,不太合理。
再后来,实在是没信心了。还是找找axis1.4的例子来参考,成功率应该比较高。结果呢,不必猜大家也都知道,也就花了不到半天的时间就把问题解决了。折腾了这么久的问题,本来一直以为解决之后会很兴奋,没想到最后解决了都没啥感觉,也许这是因为我心里早就知道用axis1.4就会成功的原因吧,如果能用cxf解决这个问题也许还会兴奋一点。
一、根据wsdl文件生成java代码命令
1、cxf
wsdl2java -d D:\wsdl D:\wsdl\Services.wsdl
wsdl2java -d D:\wsdl -server D:\wsdl\HelloWorld.wsdl (生成服务端启动类)
wsdl2java -d D:\wsdl -client D:\wsdl\HelloWorld.wsdl (生成客户端调用类)
2、axis
java -cp axis.jar;commons-logging.jar;commons-discovery-0.2.jar;jaxrpc.jar;saaj.jar;wsdl4j-1.6.2.jar;activation.jar;mail.jar org.apache.axis.wsdl.WSDL2Java D:\wsdl\Services.wsdl
二、总结一下遇到的问题或异常(以下内容部分名称进行了修改,大家懂的)
1、axis1.4调用cxf2.1.3,接口是通的,丢失对象数组参数
2、axis1.4调用cxf2.4.2,报命名空间异常,这一点在cxf2.4.2应该是控制得比较严格吧:
WARNING: Interceptor for {http://a.b.c/}CmImplService#{http://a.b.c/}sciRsp has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Unexpected wrapper element {urn:cnRsp}sciRsp found. Expected {http://a.b.c}sciRsp.
如果解决了命名空间问题,还会报:
org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:"", local:"myparams"). Expected elements are <{}a>,<{}b>,<{}c>,<{}d>
3、使用cxf根据axis1.4的wsdl生成java代码
wsdl2java -d D:\wsdl -server -client D:\wsdl\DeployManage.wsdl
提示:
WSDLToJava Error: Rpc/encoded wsdls are not supported in JAXWS 2.0
WSDLToJava Error: Thrown by JAXB : undefined simple or complex type 'soapenc:Array'
以下为引自网络的一些内容( 尝试过,1)、2)的处理方式对于某些情况是可以的,但对于我遇到的情况却是不可行的 ):
1)WSDLToJava Error: Thrown by JAXB : undefined simple or complex type 'soapenc:Array'
对与同一个wsdl文件,我尝试过使用axis2是可以正常转过来java代码。
但是,当使用cxf时,出现了报错:
Java代码:
WSDLToJava Error: Thrown by JAXB:
Thrown by JAXB:
undefined simple or complex type 'soapenc:Array'
wsdl的出错部分:
Xml代码:
<s:schema targetNamespace="http://iamsweb.gmcc.net/WS/AbstractTypes">
<s:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<s:complexType name="StringArray">
<s:complexContent mixed="false">
<s:restriction base="soapenc:Array">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
</s:sequence>
</s:restriction>
</s:complexContent>
</s:complexType>
</s:schema>
这时,只需增加schemaLocation。如
Xml代码:
<s:schema targetNamespace="http://iamsweb.gmcc.net/WS/AbstractTypes">
<s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/"/>
<s:complexType name="StringArray">
<s:complexContent mixed="false">
<s:restriction base="soapenc:Array">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
</s:sequence>
</s:restriction>
</s:complexContent>
</s:complexType>
</s:schema>
2)WSDLToJava Error: Rpc/Encoded WSDLs Are Not Supported with CXF
WSDLToJava Error: Rpc/encoded wsdls are not supported in JAXWS 2.0
RPC/encoded is a vestige from before SOAP objects were defined with XML Schema. It’s not widely supported anymore. You will need to generate the stubs using Apache Axis 1.0, which is from the same era.
java org.apache.axis.wsdl.WSDL2Java http://someurl?WSDL
You will need the following jars or equivalents in the -cp classpath param:
axis-1.4.jar
commons-logging-1.1.ja
commons-discovery-0.2.jar
jaxrpc-1.1.jar
saaj-1.1.jar
wsdl4j-1.4.jar
activation-1.1.jar
mail-1.4.jar
This will generate similar stubs to wsimport.
Alternatively, if you are not using the parts of the schema that require rpc/encoded, you can download a copy of the WSDL and comment out those bits. Then run wsimport against the local file.
If you look at the WSDL, the following bits are using rpc/encoded:
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
3)
Rpc/encoded wsdls are not supported in JAXWS 2.0
"Rpc/encoded wsdls are not supported in JAXWS 2.0"这个错误,出现在用NB6创建WebService客户端时,该服务WSDL文件有如下语句:
<wsdl:binding name="AgentBankServiceSoapBinding" type="impl:AgentBankService">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="refundPayDetailInput">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="refundPayDetailInputRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://pay.foundercy.com" use="encoded"/>
</wsdl:input>
到网上查阅了相关信息,一般说法是JAX-WS 2.0无法直接支持rpc/ecn类型的服务,在一篇为rpc/enc类型的google服务讲解使用JAX-WS2.0变通的方法访问服务时有所提到.而Axis2的 wsdl2java工具对于rpc/enc类型的wsdl文件牏处理时恐怕也有相似的问题.更不幸的是,服务端的WSDL对于客户有开发人员来说几乎是不可能改变的.有如下一些解决方案可能会有用:
1 用回老版本工具,比如Axis1或使用JAX-RPC类型等等.
2 手工做些辅助的工作,如Accessing Google Web Service using JAX-WS 所述的一样.
3 对服务端的WSDL作些相应在改变,比如将encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 句去掉,并将use="encoded"改为use= "literal".
4 在向导中把J2EE改为1.4版本之前.
没有仔细的研究,但是此服务导入VS2005时却没 现什么问题,暂时决定在.net平台下用C#来做.
(转载请注明来源:http://zhanjia.iteye.com/blog/1987912)
相关推荐
在 Axis1.4 中传递复杂类型数组参数,涉及到的是 Web 服务中的数据绑定和消息处理。Axis 是一个开源的 SOAP 库,它允许开发者创建、部署和使用 Web 服务。在处理复杂类型数组时,ArrayMapping 是 Axis 中的一个关键...
### WebService技术应用:Spring 3 + CXF 3.4与Axis 1.4的交互 在现代软件开发中,Web服务作为一种重要的技术手段,被广泛应用于不同系统之间的通信。其中,Spring框架与Apache CXF是实现RESTful或SOAP风格的Web...
标题 "axis1.4+activation.jar+mail.jar" 指涉的是一个基于Java的Web服务开发工具包,Axis1.4,以及两个必要的库文件:activation.jar和mail.jar。这些组件在Java应用程序中,尤其是涉及到网络通信和邮件处理时扮演...
而在Axis2.x中,服务接口和实现通常定义在服务档案(Service Archive, AAR)文件中,该文件包含了服务的所有依赖和元数据。 在jar文件的使用上,Axis1.x和Axis2.x都有各自的依赖库。 Axis1.x的jar文件主要包括axis....
在标签“axis1.4”中,我们可以推测这个压缩包专门针对Axis的1.4版本,该版本可能修复了之前版本的一些已知问题,同时保持向后兼容性,以便于已经在使用Axis1.x的项目平滑升级。 至于文件名称列表只有一个“axis1.4...
而Axis1.4是Apache软件基金会的一个开源项目,它提供了一个SOAP(简单对象访问协议)Web服务框架,用于创建和部署Web服务。 当我们需要在Spring Boot项目中集成Axis1.4来实现Web服务时,我们需要了解以下几个关键...
标题“myService_purpose1sv_cxf调用axis2的接口服务_接口服务_”暗示了一个名为“myService”的具体服务示例,这个服务利用CXF来调用Axis2实现的接口。"purpose1sv"可能是项目或功能的特定标识符,但没有足够的上...
标题 "axis-1.4_1.jar.zip" 暗示了这是一个包含Axis 1.4版本源码的压缩文件,轴(Axis)是Apache软件基金会的一个开源项目,主要用于构建Web服务。它是一个SOAP(简单对象访问协议)引擎,允许开发者在Java平台上...
4. **配置文件**:如axis2.xml,这是Axis2的全局配置文件,定义了服务的默认行为和运行时参数。 5. **工具和脚本**:可能包括用于生成服务或客户端代码的工具,如wsdl2java等。 了解并熟练使用Axis1.4和Axis2的相关...
axis-jaxrpc-1.4.jar jaxrpc.jar webservice java工具类jar包。
### Axis自定义数组对象知识点详解 #### 一、概述 在进行Web服务开发时,我们经常需要处理复杂的类型,如自定义的数组或对象。Apache Axis框架为Java开发者提供了强大的支持,使得创建、部署和调用Web服务变得简单...
Axis1.4是Apache组织提供的一款基于Java的Web服务框架,它允许开发者轻松地创建、发布和调用Web服务。本文将深入探讨如何使用Axis1.4.jar包以及Eclipse IDE来实现WSDL(Web Service Description Language)和服务端...
- JAX-WS(Java API for XML Web Services):这是Java平台标准,用于创建和处理Web服务,它是Axis2的替代品,相比Axis1.4更现代,支持更多特性。 通过理解上述内容,开发者能够有效地利用Axis1.4生成Web服务的...
在这个"WebService Axis1.4接口服务序列/反序列复杂项目实例"中,我们将深入探讨如何在 Axis1.4 中处理复杂的参数、自定义实体对象的序列化与反序列化,以及客户端的复杂调用。 首先,让我们理解序列化和反序列化的...
AXIS1.4客户端调用是关于Web服务客户端开发的一个主题,主要涉及到使用Apache Axis1.4库来创建和调用SOAP(Simple Object Access Protocol)服务。Apache Axis1.4是一个开源工具,它允许开发者在Java环境中轻松地...
需要注意的是,虽然这是一种可行的解决方案,但因为Axis1.4的年代久远,可能遇到一些兼容性和性能问题,所以在条件允许的情况下,推荐使用更新的Web服务框架,如Apache CXF或Spring Web Services的最新版本。
Axis1.4是一个古老的但仍然在某些场景下使用的Web服务框架,它允许开发人员创建和部署基于SOAP(Simple Object Access Protocol)的Web服务。这个框架是Apache软件基金会的一个项目,其核心目标是简化Web服务的开发...
Apache Axis1.4是历史悠久的一款开源SOAP(Simple Object Access Protocol)服务器和客户端库,它主要用于构建Web服务。这款工具在2003年发布,是Apache软件基金会的一部分,旨在简化XML-RPC和SOAP的实现。由于其...
2. **WSDL支持**:Web服务描述语言(WSDL)是定义Web服务接口的标准,Axis1.4可以生成和解析WSDL文件,使得服务的发布和发现更加方便。 3. **JAX-RPC兼容性**:Java API for XML Processing - Remote Procedure ...
Axis1.4是Apache软件基金会开发的一个开源SOAP(简单对象访问协议)库,主要用于构建和部署Web服务。这个版本的Axis是基于Java平台的,它为开发者提供了强大的工具集,以便于实现符合WS-I(Web Services ...