为 Salesforce Soap 生成企业 jar 时出现问题 API; Salesforce 生成的 WSDL XML 存在问题

Issues generating Enterprise jar for Salesforce Soap API; issue with generated WSDL XML from Salesforce

我最近对自定义对象进行了一些数据库更改,我正在尝试生成一个新的 enterprise.jar 来反映这些更改。我正在关注位于 here 的所有文档以了解该过程。我还会注意到,除了一些新的依赖项之外,我之前已经按照这个过程没有错误地生成 enterprise.jar 文件。所以这是一个过去对我的沙箱有效的过程,但我们已经 5 年没有对数据库进行任何结构更改。

遵循这些步骤非常简单。我使用 Enterprise WSDL 从我的开发人员沙箱中的 Salesforce 登录名生成 XML 文件(我们显然拥有企业级服务,因此已经建立)。从那里,我转到 Maven 存储库,从那里获取 force-wsc-48.0.0.jar(根据我的沙箱的当前 API 版本),然后下载一些依赖项,如 rhino、ST , 和 antlr-运行 时间。我将所有文件放在 C 盘的临时文件夹中,然后尝试 运行ning 命令:

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 前缀,我将得到相同的错误,但对于 soap 而不是 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 中没有定义 。如果我删除所有使用 soap 前缀的实例,我将解决以下问题。

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),如果我没有正确的 force-wsc jar 文件,如果我没有 运行 通过 Java 的正确版本(1.8,如果它不清楚,但我试过 java 的早期版本,我只是得到 minor.major 52 错误,这意味着它应该是 8,据我所知)。

如果您能帮助查明这里的问题,我们将不胜感激。我很乐意接受建议。如果只是 Salesforce 给我一个错误的 XML 文件,我可以在那里开票。我只是想在开工单之前确保我没有做错什么。

在这方面花费更多时间并与从事不同 Salesforce 项目的同事协调后,我们发现了以下内容

1 Salesforce 确实提供了错误的 WSDL 文件。

2 生成错误的 WSDL 文件只是因为我使用的是 Firefox Web 浏览器。使用 Chrome 而不是访问 WSDL 生成解决了所有问题。

所以对于将来遇到这个问题的任何可怜的灵魂,我希望使用 Chrome 也能为你解决它。