Проблемы с созданием Enterprise jar для Salesforce Soap API; проблема с сгенерированным WSDL XML из Salesforce

Недавно я внес некоторые изменения в базы данных для пользовательских объектов и пытаюсь создать новый файл enterprise.jar, чтобы отразить эти изменения. Я слежу за всей документацией, расположенной здесь, для этого процесса. Я также отмечу, что, за исключением некоторых новых зависимостей, я выполнил этот процесс раньше без ошибок для создания файла enterprise.jar. Так что это процесс, который работал в моей песочнице в прошлом, но у нас не было никаких структурных изменений в базе данных за твердые 5 лет.

Выполнять шаги достаточно просто. Я генерирую XML-файл из моей учетной записи Salesforce в своей изолированной программной среде разработчика, используя Enterprise WSDL (у нас явно есть служба уровня Enterprise, как раз так, что это установлено). Оттуда я перехожу в репозиторий Maven, получаю оттуда force-wsc-48.0.0.jar (в соответствии с текущей версией API моей песочницы), а затем загружаю несколько зависимостей, таких как rhino, ST и antlr-runtime. Я собираю все файлы во временную папку на моем диске C и пытаюсь запустить команду:

java -classpath C:\temp\force-wsc-48.0.0.jar;C:\temp\rhino1_7R4\js.jar;C:\temp\ST-4.3.1.jar;\jdk\jdk1.8.0_251\lib\tools.jar;C:\temp\antlr-runtime-3.5.jar com.sforce.ws.tools.wsdlc C:\temp\enterprise.wsdl C:\temp\enterprise.jar

Вот где начинаются проблемы. Как только я запустил это, я обнаружил следующую ошибку:

Exception in thread "main" com.sforce.ws.wsdl.WsdlParseException: Parse error: Found invalid XML. could not determine namespace bound to element prefix xsd (position: TEXT seen ...ration value="ACTIONCALL_DUPLICATE_INPUT_PARAM">\r\n<xsd:annotation>... @17360:17)
        at com.sforce.ws.wsdl.WsdlParser.next(WsdlParser.java:94)
        at com.sforce.ws.wsdl.Definitions.read(Definitions.java:111)
        at com.sforce.ws.wsdl.WsdlFactory.createFromInputStream(WsdlFactory.java:69)
        at com.sforce.ws.wsdl.WsdlFactory.create(WsdlFactory.java:49)
        at com.sforce.ws.codegen.Generator.generate(Generator.java:94)
        at com.sforce.ws.tools.wsdlc.run(wsdlc.java:115)
        at com.sforce.ws.tools.wsdlc.run(wsdlc.java:149)
        at com.sforce.ws.tools.wsdlc.main(wsdlc.java:71)
Caused by: com.sforce.ws.ConnectionException: Found invalid XML. could not determine namespace bound to element prefix xsd (position: TEXT seen ...ration value="ACTIONCALL_DUPLICATE_INPUT_PARAM">\r\n<xsd:annotation>... @17360:17)
        at com.sforce.ws.parser.XmlInputStream.next(XmlInputStream.java:138)
        at com.sforce.ws.wsdl.WsdlParser.next(WsdlParser.java:90)
        ... 7 more
Caused by: com.sforce.ws.parser.XmlPullParserException: could not determine namespace bound to element prefix xsd (position: TEXT seen ...ration value="ACTIONCALL_DUPLICATE_INPUT_PARAM">\r\n<xsd:annotation>... @17360:17)
        at com.sforce.ws.parser.MXParser.parseStartTag(MXParser.java:1826)
        at com.sforce.ws.parser.MXParser.nextImpl(MXParser.java:1144)
        at com.sforce.ws.parser.MXParser.next(MXParser.java:1111)
        at com.sforce.ws.parser.XmlInputStream.next(XmlInputStream.java:136)
        ... 8 more

Фрагмент XML в строке ошибки:

<!--
 These are the extension code to provide additional error information 
-->
<simpleType name="ExtendedErrorCode">
<restriction base="xsd:string">
<enumeration value="ACTIONCALL_DUPLICATE_INPUT_PARAM">
<xsd:annotation>
<xsd:documentation>
Errors with this extended error code have the following properties: severity, actionCallName, parameterName
</xsd:documentation>
</xsd:annotation>
</enumeration>
<enumeration value="ACTIONCALL_DUPLICATE_OUTPUT_PARAM">
<xsd:annotation>
<xsd:documentation>
Errors with this extended error code have the following properties: severity, actionCallName, parameterName
</xsd:documentation>
</xsd:annotation>
</enumeration>

Родительская схема:

<schema elementFormDefault="qualified" targetNamespace="urn:fault.enterprise.soap.sforce.com">
<import namespace="urn:enterprise.soap.sforce.com"/>

Не знаю, нужно ли это, но замечу, что в XML-файле вообще нет . xsd используется перед этим, но только для определения типов строк элементов; например:

Если я удалю префикс xsd из всего, что вызывает ошибку, я получу ту же ошибку, но для мыла вместо xsd. XML-фрагмент первого экземпляра этого:

<!-- Soap Binding -->
<binding name="SoapBinding" type="tns:Soap">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="login">
<soap:operation soapAction=""/>
<input>
<soap:header use="literal" message="tns:Header" part="LoginScopeHeader"/>
<soap:body parts="parameters" use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>

Здесь нет родительской схемы.

Опять же, в XML не определено . И если я удалю все случаи использования префикса мыла, я столкнусь со следующей проблемой.

Exception in thread "main" com.sforce.ws.wsdl.WsdlParseException: targetNamespace not specified in wsdl:definitions
        at com.sforce.ws.wsdl.Definitions.read(Definitions.java:115)
        at com.sforce.ws.wsdl.WsdlFactory.createFromInputStream(WsdlFactory.java:69)
        at com.sforce.ws.wsdl.WsdlFactory.create(WsdlFactory.java:49)
        at com.sforce.ws.codegen.Generator.generate(Generator.java:94)
        at com.sforce.ws.tools.wsdlc.run(wsdlc.java:115)
        at com.sforce.ws.tools.wsdlc.run(wsdlc.java:149)
        at com.sforce.ws.tools.wsdlc.main(wsdlc.java:71)

Опять же, не уверен, имеет ли это значение, но в XML-файле нет .

Я не знаю, связано ли это с тем, что Salesforce генерирует плохой XML-файл (проблема возникает даже в песочницах, для которых я не вносил никаких изменений в базу данных, включая производство, где у меня есть старый, но работающий файл enterprise.jar), если я у меня нет нужного jar-файла force-wsc, если я не запускаю его через правильную версию Java (1.8, если это не ясно, но я пробовал более ранние версии java, и я просто получаю второстепенный.major 52 error, значит, должно быть 8, насколько я знаю).

Любая помощь в выявлении проблемы будет принята с благодарностью. Я более чем открыт для предложений. И если Salesforce просто дает мне плохой XML-файл, я могу открыть там заявку. Я просто хочу убедиться, что не делаю что-то неправильно, прежде чем открою заявку.

1 ответ

Решение

Потратив на это больше времени и после согласования с коллегой, работающим над другим проектом Salesforce, мы обнаружили следующее

1 Salesforce выдавала абсолютно плохой файл WSDL.

2 Создание плохого файла WSDL произошло только потому, что я использовал веб-браузер Firefox. Использование Chrome вместо доступа к генерации WSDL решило проблему во всем.

Так что для любого бедняги, который столкнется с этой проблемой в будущем, я надеюсь, что использование Chrome исправит ее и для вас.

Другие вопросы по тегам