忽略Apache Axis 1.4中的意外元素的任何解决方法?

时间:2014-11-13 11:27:53

标签: java web-services soap axis

问题在2012年"Apache AXIS Ignore/Skip additional element while parsing"之前被问到Apache Axis 2.对于Axis 1.4还没有解决方法吗?

问题定义

例如;

1 - 我们在wsdl中有一个soap响应定义('ResponseGetCustomerInfo'),同时开发[使用 Axis 1.4 ]:

...
  <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 - 一段时间后,我们的服务提供商更改了服务响应并将新的输出字段添加到响应中,我们不知道何时或为何;

<?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 ... "

我不想更新wsdl并再次重新生成Web服务客户端 。那么,有没有办法在响应中跳过“意外的[新添加的]元素”?或任何解决方法?

我正在尝试很多方法,但还没有找到任何解决方案。

3 个答案:

答案 0 :(得分:3)

由于糟糕的供应商在撰写这些服务,我们总是经历这种地狱。

所以,遗憾的是,没有办法使用 WSDL2JAVA 的参数,但是有一种解决方法,你将至少重新生成一次存根:

  1. xs:sequence替换为xs:all。这允许以任何顺序返回元素,并且有助于修复大量的情况,以及生成的存根代码,这使得步骤更容易
  2. 很抱歉,但是对于每个响应bean,您从生成的代码(例如ResponseGetCustomerInfo.java)进入其类,而不是:
  3. while(!reader.isStartElement() && !reader.isEndElement())
       reader.next();
    
    if(reader.isStartElement())
    // A start element we are not expecting indicates a trailing invalid
    // property
    throw new org.apache.axis2.databinding.ADBException("Unexpected subelement " + reader.getLocalName());
    

    有这个:

    while(!reader.isStartElement() && !reader.isEndElement())
       reader.next();
    
    // if(reader.isStartElement())
    // A start element we are not expecting indicates a trailing invalid
    // property
    
    // The below is commented, to prevent unexpected result parameters from causing an exception
    // (As well as the condition above is removed)
    //  throw new org.apache.axis2.databinding.ADBException("Unexpected subelement " + reader.getLocalName());
    

    它的测试和工作至少比没有解决方案更好。

答案 1 :(得分:1)

没有使用过Axis 1.4,但是在快速浏览一下文档之后。

您可以在代码中添加处理程序。你甚至可以做到这一点,而不必重新编译它,这是一个问题。 Handler包装底层Web服务,在调用服务之前调用它,并在它返回之后调用。它有点像Servlet过滤器,但对于Web服务。

Handler在向前发送以进行处理之前可以完全访问SOAP正文。因此,您可以将其用作删除您不喜欢的元素的机会。

稍微挖一下,你会发现你最终得到一个代表你的SOAP主体的DOM元素,所以你可以玩原始的DOM游戏来添加/删除节点等,然后在Handler中将其全部设置回来。 / p>

您的服务永远不会在编辑SOAP主体中看到新节点。

所有这一切,你甚至可以使用Servlet过滤器来做到这一点。

答案 2 :(得分:0)

尝试使用Metro库而不是Axis,它在2014年10月适用于我。如果您必须使用Axis库,请忽略此建议。

使用Axis 2库创建一个调用.NET WCF服务(通过Internet安全通信)的Java客户端,我们从WSDL生成Java客户端类时出错。作为一种解决方法,我们切换到另一个库Metro 2.3,我们能够生成运行没有任何问题的Java客户端。

从Java获得成功的安全Web服务调用的一个重要步骤是配置客户端和服务器证书。