使用AXIS2调用SOAP WebService遇AxisFault异常求助
解决Axis2调用SOAP服务报错“this is a soap-encoded endpoint”的问题
我之前也碰到过一模一样的问题,其实核心原因是Axis2默认优先支持document-literal风格的SOAP服务,而你要调用的这个endpoint是soap-encoded(也就是RPC-encoded)类型的,Axis2对这种编码风格的支持需要额外配置——而SoapUI会自动适配不同的SOAP编码格式,所以能正常请求。下面是几个亲测有效的解决步骤:
1. 检查并修改Axis2全局配置文件(axis2.xml)
确保Axis2启用了RPC-encoded对应的消息处理器和构建器:
- 找到
messageReceivers节点,确认包含RPC风格的接收器:<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/> - 找到
messageBuilders和messageFormatters节点,添加或确保存在soap-encoded对应的配置:<!-- 针对text/xml类型的RPC编码支持 --> <messageBuilder contentType="text/xml" class="org.apache.axis2.builder.RPCSOAPBuilder"/> <messageFormatter contentType="text/xml" class="org.apache.axis2.format.RPCSOAPFormatter"/>
2. 重新生成客户端时指定RPC-encoded风格
如果是用Axis2的wsdl2java工具生成客户端代码,一定要加上风格和编码参数,确保生成的客户端适配目标服务:
wsdl2java -uri your-service.wsdl -style RPC -use encoded -p com.yourcompany.client
-style RPC:指定生成RPC风格的客户端-use encoded:指定使用encoded编码方式-p:指定生成代码的包名
3. 手动调整现有客户端代码
如果已经有现成的客户端代码,可以手动修改调用逻辑,强制使用RPC-encoded格式:
ServiceClient serviceClient = new ServiceClient(); // 获取操作客户端 OutInAxisOperationClient operationClient = (OutInAxisOperationClient) serviceClient.createClient(ServiceClient.ANON_OUT_IN_OP); // 设置RPC编码的消息构建器和格式化器 operationClient.getOperationContext().setProperty(Constants.Configuration.MESSAGE_BUILDER, "org.apache.axis2.builder.RPCSOAPBuilder"); operationClient.getOperationContext().setProperty(Constants.Configuration.MESSAGE_FORMATTER, "org.apache.axis2.format.RPCSOAPFormatter");
另外要注意,确保你的请求参数包装方式和SoapUI中的一致——比如参数是否在<param>标签中、命名空间是否正确。
4. 对比SoapUI和Axis2的请求报文
抓包或者打印Axis2发送的SOAP请求,和SoapUI中能正常工作的请求做对比,重点检查:
- SOAP信封的命名空间(比如
soapenc:前缀是否存在) - 参数的编码方式(是否有
xsi:type属性) - 整体的XML结构是否一致
根据差异调整Axis2的请求配置,直到两者匹配。
内容的提问来源于stack exchange,提问作者Harshit
相关产品推荐
相关产品推荐

