我遇到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
似乎只能指向一个命名空间,这可能是解析callout响应仍然失败的原因。
答案 0 :(得分:4)
我已经构建了一个自动创建Apex类的工具。它包括对xs:extension和xs:import(以及其他内容)的支持。
对于ex:扩展名,该工具会将必需的字段从基类拉入子类并正确配置_type_info
成员。
你可以免费获得它 - FuseIT SFDC Explorer。目前只在Windows中直接运行。我曾经有过使用Wine成功运行它的人的报告。 (披露:我为发布此工具的公司工作)。
顺便提一下,salesforce.stackexchange.com网站是询问Salesforce特定问题的好地方。