我在生成 wsdl2apex 代码时遇到问题,主要是因为在我的 WSDL 中使用了 xs:import namespace
和 xs:extension
。
特别是,我看到了错误 System.CalloutException: Web service callout failed: Unable to parse callout response。找不到元素的 Apex 类型。 . .
。 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
似乎只能指向一个命名空间,这可能是 callout 响应的解析仍然失败的原因。
最佳答案
我已经构建了一个工具来自动创建 Apex 类。它包括对 xs:extension 和 xs:import 的支持(以及其他)。
在 ex:extension 的情况下,该工具会将必需的字段从基类拉到子类中,并正确配置 _type_info
成员。
您可以免费获得 - FuseIT SFDC Explorer .目前仅在 Windows 中直接运行。我收到过有人使用 Wine 成功运行它的报告。 (披露:我在发布此工具的公司工作)。
顺便说一句,salesforce.stackexchange.com站点是询问 Salesforce 特定问题的好地方。
关于wsdl - 修改 Wsdl2Apex 生成的类以处理 xs :extension and imported namespaces,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13783420/