Проблемы с созданием 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. 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 исправит ее и для вас.