修改Wsdl2Apex生成的类以处理xs:扩展和导入的命名空间

时间:2012-12-09 00:24:46

标签: wsdl salesforce apex-code

我遇到wsdl2apex代码生成问题,主要是因为我的WSDL中使用了xs:import namespacexs: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似乎只能指向一个命名空间,这可能是解析callout响应仍然失败的原因。

1 个答案:

答案 0 :(得分:4)

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

对于ex:扩展名,该工具会将必需的字段从基类拉入子类并正确配置_type_info成员。

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

顺便提一下,salesforce.stackexchange.com网站是询问Salesforce特定问题的好地方。