java:JAXWS 2.0 不支持 Rpc/编码的 wsdls

Posted

技术标签:

【中文标题】java:JAXWS 2.0 不支持 Rpc/编码的 wsdls【英文标题】:java: Rpc/encoded wsdls are not supported in JAXWS 2.0 【发布时间】:2010-09-29 14:12:25 【问题描述】:

我正在使用 CXF 2.1 从 wsdl 生成 java 代码,但出现以下错误:

WSDLToJava Error: Rpc/encoded wsdls are not supported in JAXWS 2.0

org.apache.cxf.tools.common.ToolException: Rpc/encoded wsdls are not supported in JAXWS 2.0
    at org.apache.cxf.tools.wsdlto.frontend.jaxws.wsdl11.JAXWSDefinitionBuilder.checkSupported(JAXWSDefinitionBuilder.java:141)
    at org.apache.cxf.tools.wsdlto.frontend.jaxws.wsdl11.JAXWSDefinitionBuilder.build(JAXWSDefinitionBuilder.java:87)
    at org.apache.cxf.tools.wsdlto.frontend.jaxws.wsdl11.JAXWSDefinitionBuilder.build(JAXWSDefinitionBuilder.java:61)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:127)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:232)
    at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:83)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:103)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.main(WSDLToJava.java:173)

如何修复这个错误,我可以使用以前版本的 CXF 或其他任何东西来修复它吗?

【问题讨论】:

【参考方案1】:

RPC/encoded 是使用 XML Schema 定义 SOAP 对象之前的遗迹。现在是not widely supported。您需要使用来自同一时代的Apache Axis 1.0 生成存根。

java org.apache.axis.wsdl.WSDL2Java http://someurl?WSDL 

您将需要在 -cp 类路径参数中包含以下 jar 或等效项:

axis-1.4.jar commons-logging-1.1.ja commons-discovery-0.2.jar jaxrpc-1.1.jar saaj-1.1.jar wsdl4j-1.4.jar activation-1.1.jar mail-1.4.jar

这将生成与 wsimport 类似的存根。

或者,如果您不使用需要 rpc/encoded 的架构部分,您可以下载 WSDL 的副本并注释掉这些位。然后对本地文件运行 wsimport。

如果查看 WSDL,以下位使用 rpc/encoded:

<soap:body use="encoded"
           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

【讨论】:

互联网上有没有针对这个问题的文档? 在最后一个 Axis 1.4 发行版上,我有不同的 jar 命名并且 mail-1.4.jar 不存在。它不能按原样工作。 (我关注了您的 Axis 1.0 链接) 你需要明确添加。mail-1.x.jar 和activation-1.x.jar 我试过你的方法,我得到“java.net.ProtocolException: Server redirected too many times”,这可能是因为我试图从需要身份验证的 Web 服务导入,如何使用您的方法处理身份验证? @Albert,对于 maven,请参阅下面的我的帖子【参考方案2】:

我使用了 his answer 中的 Chase Seibert 建议的 Axis 1.4,尽管该答案中给出的下载链接不起作用。我使用的替代下载链接给了我不同的库。以下是我生成代码的步骤。

转到 http://apache.is.co.za/axis/axis/java/1.4/ 并下载 axis-bin-1_4.zip

解压,你应该有以下文件(以及其他):

axis.jar commons-discovery-0.2.jar commons-logging-1.0.4.jar jaxrpc.jar saaj.jar wsdl4j-1.5.1.jar

使用以下命令执行 WSDL2Java(当然是替换 URL):

java -cp axis.jar;commons-logging-1.0.4.jar;commons-discovery-0.2.jar;jaxrpc.jar;saaj.jar;wsdl4j-1.5.1.jar org.apache.axis.wsdl.WSDL2Java http://someURL?WSDL

这将生成您的 Java 文件。

P.S.:这似乎在使用 Axis 1.2.1 时同样有效。

【讨论】:

报告缺少两个类,导致附件支持被禁用。要解决此问题,请获取 mail.jar 和 activation.jar 并将它们添加到命令中。 添加 mailapi.jar 和 activation.jar 如@Marco Brochet 所述。我使用了 -classpath 并替换了“;”和 ”:”。 java -classpath axis.jar:commons-logging-1.0.4.jar:commons-discovery-0.2.jar:jaxrpc.jar:saaj.jar:wsdl4j-1.5.1.jar:mailapi.jar:activation.jar org. apache.axis.wsdl.WSDL2Java api.clickatell.com/soap/webservice.php?WSDL【参考方案3】:

这可能对 CXF 有所帮助。 Alteast 它对我有用。 我编辑了 WSDL 文件并删除了 SOAP-ENC 的所有引用,并以以下方式创建了类型 ArrayOfString

<xsd:complexType name="ArrayOfString">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="String" type="xsd:string"/>
    </xsd:sequence>
</xsd:complexType>

【讨论】:

【参考方案4】:

如果有人想使用 maven:(加上here 一些关于 WSDL 绑定样式的信息)

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>axistools-maven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                    <configuration>
                        <!-- Use your .wsdl location here-->
                        <sourceDirectory>$basedir/src/main/resources/wsdl</sourceDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<!-- Here the libraries that you need to call the Axis WS client -->
<dependencies>
    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis-jaxrpc</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>commons-discovery</groupId>
        <artifactId>commons-discovery</artifactId>
        <version>0.5</version>
    </dependency>
    <dependency>
        <groupId>axis</groupId>
        <artifactId>axis-wsdl4j</artifactId>
        <version>1.5.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis-saaj</artifactId>
        <version>1.4</version>
    </dependency>
    <!-- activation+mail: To stop Axis generating WARNING about "Attachment support being disabled" -->
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>
</dependencies>

【讨论】:

【参考方案5】:

这就是发生在我身上的事情(同一文件夹中的旧 wsdl):https://www.damirscorner.com/blog/posts/20180831-CodeGenerationWithMavenCxfPlugin.html

“很明显,是其他原因导致了 Maven 插件的问题。经过大量试验和错误后,我终于找到了问题的根源。同一文件夹中还有另一个 WSDL 文件,该文件用于 RPC /literal web 服务。插件失败,因为它试图处理它,尽管配置中我的 WSDL 路径的完整路径没有以任何方式指向它。"

【讨论】:

【参考方案6】:

只是提取并执行 WSDL2Java?使用以下命令(当然是替换 URL):

java -cp axis.jar;commons-logging-1.0.4.jar;commons-discovery-0.2.jar;jaxrpc.jar;saaj.jar;wsdl4j-1.5.1.jar org.apache.axis.wsdl.WSDL2Java http://someURL?WSDL

【讨论】:

以上是关于java:JAXWS 2.0 不支持 Rpc/编码的 wsdls的主要内容,如果未能解决你的问题,请参考以下文章

Weblogic Jaxws部署 - 类不支持JDK1.5

基于 JSON-RPC 2.0 的 API 出现问题

怎样调用java的webservice,wsdl怎样生成java代码

如何在 C# 中的 JSON-RPC 2.0 中编写“参数”?

jaxws-ri 和 jaxws-rt 有啥区别?

GWT RPC 如何在其有效负载中编码 java.lang.Long 值?