3

我在生成 wsdl2apex 代码时遇到问题,主要是由于在我的 WSDL中使用xs:import namespace和使用。xs:extension

特别是,我看到了错误System.CalloutException: Web service callout failed: Unable to parse callout response. Apex type not found for element . . .。Web 服务返回的原始 SOAP 响应看起来与我预期的一样。

我想修改生成的 Apex 类来解决这个问题,因为对 Web 服务的服务器端更改不是一个选项。

SOAP 响应如下所示:

<ns:getAccountsResponse>
 <ns:return xsi:type="ax1:AccountReturn">
  <ax2:successful>true</ax2:successful>
  <ax2:transactionId>1000</ax2:transactionId>
  <ax1:Accounts xsi:type="ax1:Account">

对于 ax1 目标命名空间,WSDL 看起来像这样:

<xs:complexType name="AccountReturn">
 <xs:complexContent>
  <xs:extension base="ax100:BaseReturnObject">
   <xs:sequence>
    <xs:element maxOccurs="unbounded" minOccurs="0" name="Accounts" nillable="true" type="ax1:Account"/>
   </xs:sequence>
  </xs:extension>
 </xs:complexContent>
</xs:complexType>

对于 ax2 目标命名空间:

<xs:complexType name="BaseReturnObject">
 <xs:sequence>
  <xs:element minOccurs="0" name="successful" type="xs:boolean"/>
  <xs:element minOccurs="0" name="transactionId" nillable="true" type="xs:integer"/>
 </xs:sequence>
</xs:complexType>

生成的映射到 AccountReturn 的 Apex 类仅包含 ax1 中的 Accounts 字段,但不包含 ax2 中的 BaseReturnObject 字段,因为 wsdl2apex 生成不尊重xs:extension命名空间的使用或导入(基于我的研究)。

无论如何修改 Apex 类以使其工作?我尝试将 BaseReturnObject 中的字段添加到 AccountReturn,并修改field_order_type_info. 但是,似乎apex_schema_type_info只能指向一个命名空间,这可能是调用响应的解析仍然失败的原因。

4

1 回答 1

4

我已经构建了一个用于自动创建 Apex 类的工具。它包括对 xs:extension 和 xs:import (除其他外)的支持。

在 ex:extension 的情况下,该工具会将所需字段从基类拉到子类中并正确配置_type_info成员。

您可以免费获得它 - FuseIT SFDC Explorer。目前仅在 Windows 中直接运行。我有报告说人们使用 Wine 成功运行了它。(披露:我为发布此工具的公司工作)。

顺便说一句,salesforce.stackexchange.com站点是询问 Salesforce 特定问题的好地方。

于 2014-09-02T01:56:22.007 回答