在2012年"Apache AXIS Ignore/Skip additional element while parsing"之前,Apache Axis 2问了这个问题 . 对于Axis 1.4,还没有解决方法吗?
Problem Definition
例如;
1- 在开发[使用Axis 1.4]时,我们的wsdl中有一个soap响应定义('ResponseGetCustomerInfo'):
...
<xs:element name="ResponseGetCustomerInfo">
<xs:complexType>
<xs:sequence>
<xs:element ref="ns1:CustomerID"/>
<xs:element ref="ns1:CustomerUsername"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CustomerID" type="xs:integer"/>
<xs:element name="CustomerUsername" type="xs:string"/>
...
2- 当我们得到这样的结果时,很高兴看到响应是可解析的:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ResponseGetCustomerInfo xmlns="http://tempUri.org/">
<CustomerID>1</CustomerID>
<CustomerUsername>raki</CustomerUsername>
</ResponseGetCustomerInfo>
</soap:Body>
</soap:Envelope>
3- 一段时间后,我们的服务提供商更改了服务响应并将新的输出字段添加到响应和 we don't know when or why ;
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ResponseGetCustomerInfo xmlns="http://tempUri.org/">
<CustomerID>1</CustomerID>
<CustomerUsername>raki</CustomerUsername>
<CustomerName>Raki</CustomerName>
<CustomerSurname>Bandao</CustomerSurname>
</ResponseGetCustomerInfo>
</soap:Body>
</soap:Envelope>
4- 新的响应在理论上与旧版本兼容,因为没有字段既没有删除也没有更改 . 但Axis无法解析响应:
"SAXException: Invalid Element ... "
I don't want to update wsdl and regenerate web service client again . 那么,有没有办法在回复中跳过"Unexpected[newly added] elements"?或任何解决方法?
我正在尝试很多方法,但还没有找到任何解决方案 .
3 回答
由于糟糕的供应商在编写这些服务,我们总是经历这种地狱 .
所以,不幸的是,没有办法使用 WSDL2JAVA 的参数,但是有一个解决方法,你将至少重新生成一次存根:
将
xs:sequence
替换为xs:all
. 这允许以任何顺序返回元素,并且有助于修复大量的情况,以及生成的存根代码,这使得步骤更容易抱歉,但是对于每个响应bean,您从生成的代码(例如ResponseGetCustomerInfo.java)进入其类,而不是:
拥有这个:
它的测试和工作至少比没有解决方案更好 .
没有使用过Axis 1.4,但是在快速浏览一下文档之后 .
您可以在代码中添加处理程序 . 你甚至可以做到这一点,而不必重新编译它,这是一个问题 . Handler包装底层Web服务,它在调用服务之前调用,并在返回之后调用 . 它有点像Servlet过滤器,但对于Web服务 .
处理程序在向前发送以进行处理之前,可以完全访问SOAP正文 . 因此,您可以将此作为删除不喜欢的元素的机会 .
稍微挖一下,你会发现你最终会得到一个代表你的SOAP主体的DOM元素,所以你可以玩原始的DOM游戏来添加/删除节点等,然后在Handler中设置它 .
您的服务永远不会在编辑SOAP正文中看到新节点 .
总而言之,您甚至可以使用Servlet过滤器完成此操作 .
尝试使用Metro库而不是Axis,它在2014年10月对我有用 . 如果你必须使用Axis库,请忽略这个建议 .
使用Axis 2库创建一个调用.NET WCF服务(通过Internet安全通信)的Java客户端,我们从WSDL生成Java客户端类时出错 . 作为一种解决方法,我们切换到另一个库Metro 2.3,我们能够生成运行没有任何问题的Java客户端 .
从Java获得成功的安全Web服务调用的重要步骤之一是配置客户端和服务器证书 .