wsdl2apex コードの生成に問題があります。これは主に、WSDL の使用xs:import namespace
とxs:extension
WSDL での使用が原因です。
特に、エラーが表示されますSystem.CalloutException: Web service callout failed: Unable to parse callout response. Apex type not found for element . . .
。Web サービスから返される未加工の SOAP 応答は、期待どおりに見えます。
サーバー側で Web サービスを変更することはできないため、生成された Apex クラスを変更してこの問題を回避したいと考えています。
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 のアカウントのフィールドのみが含まれますが、ax2 の BaseReturnObject フィールドは含まれません。これは、wsdl2apex 生成がxs:extension
名前空間の使用またはインポートを考慮しないためです (私の調査に基づく)。
これを機能させるために Apex クラスを変更する方法はありますか? BaseReturnObject から AccountReturn にフィールドを追加して、変更してみfield_order_type_info
ました。ただし、 はapex_schema_type_info
1 つの名前空間しか指定できないようです。これが、コールアウト応答の解析がまだ失敗している理由である可能性があります。