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的主要内容,如果未能解决你的问题,请参考以下文章
怎样调用java的webservice,wsdl怎样生成java代码