使用JDK工具wsimport从.NET 2.0应用程序生成的WSDL中生成Java SOAP Web服务客户端时出现问题。

42
我正尝试使用JDK 6工具wsimport生成一些SOAP web服务的客户端。 这些WSDL是由.NET 2.0应用程序生成的,对于.NET 3.X应用程序来说,它可以正常运行。
当我执行以下命令时:
wsimport -keep -p mypackage http://myservice?wsdl

出现了多个这样的错误信息:

 

[ERROR]已经使用了同名的类/接口“mypackage.SomeClass”。   使用类自定义来解决此冲突。第??行:http://myservice?wsdl

当我使用Axis 1.4(使用Eclipse WebTools插件)生成Web服务客户端时。

有人知道我该怎么做才能使用wsimport工具吗?我真的不明白什么是“类定制”。

4个回答

95

我不知道这个问题是否已经解决,但我花了一些时间在谷歌上搜索这个问题的解决方案。

我在这里找到一个解决方法 - https://jax-ws.dev.java.net/issues/show_bug.cgi?id=228

解决方案是使用-B-XautoNameResolution (无空格)运行wsimport。


通过在wsimport命令后添加此代码解决了问题。但对我来说,这个问题的根源是有两种不同类型的相邻XResponse和带下划线的X_Response,因此会发生名称冲突。如果命名像XResponseXResponseDefinition这样易于理解,就不会有问题。 - fiskra
节省了我的时间。非常感谢。-> wsimport -keep -verbose example.wsdl -B-XautoNameResolution - Akhil Babu Korkandi

22

如果你正在使用maven,这里是如何将它添加到.pom文件中的。请注意配置部分中的args参数。在文档中很难找到这个信息,感谢Isaac Stephens提供的帮助。

<!-- definition for ERPStandardWork service -->
<execution>
  <id>ERPStandardWorkService</id>
  <goals>
    <goal>wsimport</goal>
  </goals>
  <configuration>
    <!-- this resolves naming conflicts within the wsdl - there are several copies of fault report objects which clash otherwise. -->
    <args>
       <arg>-B-XautoNameResolution</arg>
    </args>
    <wsdlDirectory>${basedir}/src/main/resources/META-INF/wsdl</wsdlDirectory>
    <wsdlFiles>
        <wsdlFile>ERPStandardWork.wsdl</wsdlFile>
    </wsdlFiles>
      <wsdlLocation>${basedir}/src/main/resources/META-INF/wsdl/ERPStandardWork.wsdl
    </wsdlLocation>
    <staleFile>${project.build.directory}/jaxws/ERPStandardWork/.staleFlag
    </staleFile>
  </configuration>
</execution>

1
上面的被接受的答案可以解决你的问题,但不能修复根本原因。
问题发生的原因是你的wsdl文件中的一个操作与xsd文件中的一个xsd:complexType具有相同的名称 - 就像下面的示例一样。所有类型和操作都应该有唯一的名称。
<xsd:complexType name="SearchDocuments">
      <xsd:sequence>
        <xsd:element name="document" type="ns0:SearchDocumentById" maxOccurs="unbounded"/>
      </xsd:sequence>
</xsd:complexType>

<operation name="SearchDocuments">
      <input wsam:Action="http://controller.xxx.xxx.com/DocumentWS/searchDocumentsRequest" message="tns:searchDocumentsRequest"/>
      <output wsam:Action="http://controller.xxx.xxx.com/DocumentWS/searchDocumentsResponse" message="tns:searchDocumentsResponse"/>
</operation>

因此,请检查您的操作和类型。确保它们没有相同的名称,即没有重复的名称。


0

你可能正在将所有类从同一个WSDL文件生成到同一个包中。如果是这种情况,请尝试使用wsimport的-p选项为每个WSDL文件指定不同的目标包。


这真的不是问题,我使用了不同的-p选项。 - razenha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接