我在生成 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
只能指向一个命名空间,这可能是调用响应的解析仍然失败的原因。