Ошибки компиляции Salesforce при создании класса Apex из WSDL - PullRequest
1 голос
/ 15 сентября 2011

Когда я пытаюсь сгенерировать классы Apex из приведенного ниже файла WSDL, я получаю следующие сгенерированные классы с ошибками компиляции: Ошибка: testxyzCom Ошибка: неожиданный токен: «limit» в 7:23

Сгенерированный класс также приведен ниже.У меня уже есть некоторый опыт работы с Salesforce, и, насколько я помню, если документ WSDL содержит зарезервированное слово Apex, к слову добавляется _x при создании класса Apex.Например, limit в документе WSDL преобразуется в limit_x в сгенерированном классе Apex.Но в вышеприведенном случае этого не происходит, пожалуйста, объясните.Пожалуйста, помогите мне.

Файл WSDL

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions targetNamespace="http://test.xyz.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://test.xyz.com" xmlns:intf="http://test.xyz.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<!--WSDL created by Apache Axis version: 1.4 
Built on Apr 22, 2006 (06:55:48 PDT)--> 
<wsdl:types> 
<schema elementFormDefault="qualified" targetNamespace="http://test.xyz.com" xmlns="http://www.w3.org/2001/XMLSchema"> 
<element name="createOpurtunityData"> 
<complexType> 
<sequence> 
<element maxOccurs="unbounded" name="keys" type="xsd:string"/> 
<element maxOccurs="unbounded" name="values" type="xsd:string"/> 
<element name="limit" type="xsd:int"/> 
</sequence> 
</complexType> 
</element> 
<element name="createOpurtunityDataResponse"> 
<complexType> 
<sequence> 
<element maxOccurs="unbounded" name="createOpurtunityDataReturn" type="xsd:string"/> 
</sequence> 
</complexType> 
</element> 
</schema> 
</wsdl:types> 

<wsdl:message name="createOpurtunityDataResponse"> 

<wsdl:part element="impl:createOpurtunityDataResponse" name="parameters"> 

</wsdl:part> 

</wsdl:message> 

<wsdl:message name="createOpurtunityDataRequest"> 

<wsdl:part element="impl:createOpurtunityData" name="parameters"> 

</wsdl:part> 

</wsdl:message> 

<wsdl:portType name="TestWSDL"> 

<wsdl:operation name="createOpurtunityData"> 

<wsdl:input message="impl:createOpurtunityDataRequest" name="createOpurtunityDataRequest"> 

</wsdl:input> 

<wsdl:output message="impl:createOpurtunityDataResponse" name="createOpurtunityDataResponse"> 

</wsdl:output> 

</wsdl:operation> 

</wsdl:portType> 

<wsdl:binding name="TestWSDLSoapBinding" type="impl:TestWSDL"> 

<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 

<wsdl:operation name="createOpurtunityData"> 

<wsdlsoap:operation soapAction=""/> 

<wsdl:input name="createOpurtunityDataRequest"> 

<wsdlsoap:body use="literal"/> 

</wsdl:input> 

<wsdl:output name="createOpurtunityDataResponse"> 

<wsdlsoap:body use="literal"/> 

</wsdl:output> 

</wsdl:operation> 

</wsdl:binding> 

<wsdl:service name="TestWSDLService"> 

<wsdl:port binding="impl:TestWSDLSoapBinding" name="TestWSDL"> 

<wsdlsoap:address location="http://tempuri.org/Salesforcexyz/services/TestWSDL"/> 

</wsdl:port> 

</wsdl:service> 

</wsdl:definitions> 

Сгенерированный класс Apex равен

/Generated by wsdl2apex 

public class testxyzCom { 
public class createOpurtunityData_element { 
public String[] keys; 
public String[] values; 
public Integer limit; 
private String[] keys_type_info = new String[]{'keys','http://www.w3.org/2001/XMLSchema','string','1','-1','false'}; 
private String[] values_type_info = new String[]{'values','http://www.w3.org/2001/XMLSchema','string','1','-1','false'}; 
private String[] limit_type_info = new String[]{'limit','http://www.w3.org/2001/XMLSchema','int','1','1','false'}; 
private String[] apex_schema_type_info = new String[]{'http://test.xyz.com','true','false'}; 
private String[] field_order_type_info = new String[]{'keys','values','limit'}; 
} 
public class TestWSDL { 
public String endpoint_x = 'http://tempuri.org/Salesforcexyz/services/TestWSDL'; 
public Map<String,String> inputHttpHeaders_x; 
public Map<String,String> outputHttpHeaders_x; 
public String clientCertName_x; 
public String clientCert_x; 
public String clientCertPasswd_x; 
public Integer timeout_x; 
private String[] ns_map_type_info = new String[]{'http://test.xyz.com', 'testxyzCom'}; 
public String[] createOpurtunityData(String[] keys,String[] values,Integer limit) { 
testxyzCom.createOpurtunityData_element request_x = new testxyzCom.createOpurtunityData_element(); 
testxyzCom.createOpurtunityDataResponse_element response_x; 
request_x.keys = keys; 
request_x.values = values; 
request_x.limit = limit; 
Map<String, testxyzCom.createOpurtunityDataResponse_element> response_map_x = new Map<String, testxyzCom.createOpurtunityDataResponse_element>(); 
response_map_x.put('response_x', response_x); 
WebServiceCallout.invoke( 
this, 
request_x, 
response_map_x, 
new String[]{endpoint_x, 
'', 
'http://test.xyz.com', 
'createOpurtunityData', 
'http://test.xyz.com', 
'createOpurtunityDataResponse', 
'testxyzCom.createOpurtunityDataResponse_element'} 
); 
response_x = response_map_x.get('response_x'); 
return response_x.createOpurtunityDataReturn; 
} 
} 
public class createOpurtunityDataResponse_element { 
public String[] createOpurtunityDataReturn; 
private String[] createOpurtunityDataReturn_type_info = new String[]{'createOpurtunityDataReturn','http://www.w3.org/2001/XMLSchema','string','1','-1','false'}; 
private String[] apex_schema_type_info = new String[]{'http://test.xyz.com','true','false'}; 
private String[] field_order_type_info = new String[]{'createOpurtunityDataReturn'}; 
} 
} 

1 Ответ

0 голосов
/ 30 сентября 2011

Недавно у меня была похожая проблема с WSDL, который сгенерировал класс APEX с использованием зарезервированного ключевого слова long.

Я не думаю, что wsdl2apex достаточно умен, чтобы добавить суффикс к зарезервированным ключевым словам, как вы предлагаете.

Можете ли вы сделать это вручную сгенерированному классу?

В createOpurtunityData_element

public Integer limit_x; 

In TestWSDL

public String[] createOpurtunityData(String[] keys,String[] values,Integer limit_x) {

request_x.limit_x = limit_x;

Я не уверен на 100%, как вызов WebServiceCallout.invoke справится с этим изменением. Если вы можете, было бы проще обновить веб-сервис и WSDL, чтобы он не использовал ключевое слово APEX.

...