wsimport - 两个声明造成冲突,在同一行上给出

21

尝试使用 wsimport 为 SOAP 端点生成客户端。WSDL 和所有使用的 XSD 文件都是本地副本。

正在执行的命令如下:

wsimport ./bwWsdl.xml -p com.generated -Xnocompile -d ../src -extension -keep -XadditionalHeaders -B-XautoNameResolution

这会导致出现以下错误:

[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 16 of file:/schemas/newSchema.xsd

[ERROR] (Related to above error) This is the other declaration.   
  line 16 of file:/schemas/newSchema.xsd

注意报告的碰撞行号是相同的。

以下是模式:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
  version="2.004" id="OTA2003A2009A">

  <xs:complexType name="TPA_ExtensionsType">
    <xs:annotation>
      <xs:documentation xml:lang="en">Description here.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:element name="TPA_Extensions" type="TPA_ExtensionsType">
    <xs:annotation>
      <xs:documentation xml:lang="en">More description here.</xs:documentation>
    </xs:annotation>
  </xs:element>
</xs:schema>  

我已经尝试过去掉类型定义,但它在许多其他地方被引用。

请问有谁能提供如何使这个工作的建议吗?

谢谢

编辑:

这里是WSDL导入这些模式的行:

<definitions name='ResLookupGet' targetNamespace='http://org.jboss.ws/resLookupGet' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:http='http://schemas.xmlsoap.org/wsdl/http/' xmlns:mime='http://schemas.xmlsoap.org/wsdl/mime/' xmlns:ns='http://www.opentravel.org/OTA/2003/05/beta' xmlns:rq='http://www.opentravel.org/OTA/2003/05/betarq' xmlns:rs='http://www.opentravel.org/OTA/2003/05/betars' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://org.jboss.ws/resLookupGet' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
 <types>
  <xsd:schema targetNamespace='http://org.jboss.ws/resLookupGet' xmlns:tns='http://org.jboss.ws/resLookupGet' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
   <xsd:import namespace='http://www.opentravel.org/OTA/2003/05/betarq' schemaLocation='./schemas/FooAffiliateHeaderRQ.xsd'/>
   <xsd:import namespace='http://www.opentravel.org/OTA/2003/05/betarq' schemaLocation='./schemas/FooResLookupGetRQ.xsd'/>
   <xsd:import namespace='http://www.opentravel.org/OTA/2003/05/betars' schemaLocation='./schemas/FooResLookupGetRS.xsd'/>
  </xsd:schema>
 </types>
<message name='ResLookupGetRQ'>
  <part element='rq:FooResLookupGetRQ' name='FooResLookupGetRQ'></part>
 </message>
 <message name='ResLookupGetRS'>
  <part element='rs:FooResLookupGetRS' name='FooResLookupGetRS'></part>
 </message>

你能否发布一组文件,以便达到相同的效果?这个错误信息通常是由于以一种混淆加载器基本URI的方式多次加载相同的定义而引起的。 - Petru Gardea
我会尝试将导致问题的路径可视化/跟踪到XSD文件中。如果这是基于开放旅行联盟...我假设您构建了WSDL;您能指示高级结构吗?例如,您是否从WSDL导入OTA xsd,是否在WSDL中定义XSD内容,或者是否导入一个外部XSD,该外部XSD又引用所有其他XSD? - Petru Gardea
WSDL是在其他地方开发的,它导入了三个XSD文件,这些文件又引用了其他文件...最终到达了只包含上面片段中类型的20行XSD文件。我尝试将类型重命名为各种东西,但仍然遇到相同的错误...顺便感谢您的帮助。 - Cuga
已更新,包括导入模式的WSDL顶部。 - Cuga
让我们在聊天中继续这个讨论。点击此处进入聊天室 - Petru Gardea
显示剩余2条评论
2个回答

33

感谢 @Petru Gardea 的帮助,我最终能够通过省略 wsimport 中的 -p com.generated 包规范来解决这个问题。所以,以下是我最终能够成功运行以解决此问题的内容:

wsimport ./bwWsdl.xml -Xnocompile -d ../src -extension -keep -XadditionalHeaders -B-XautoNameResolution
这是因为wsimport试图生成具有相同名称和/或方法的相同包中的类,显然这是不可能的。因此,通过省略强制包声明,wsimport可以将类放在它想要的任何包中,根据WSDL中的<xsd:schema>定义,这会导致分别位于3个不同的包中。
感谢@Petru!

2
在JDK 1.8上,这也变得非常有用:wsimport wsdlName.xml -J-Djavax.xml.accessExternalDTD=all ...以及wsimport wsdlName.xml -J-Djavax.xml.accessExternalSchema=all ... - Cuga
如果您在Maven POM中运行wsimport,则必须删除<tag><packageName>标签。 - Jan Seevers
@Cuga您好,感谢您发布这篇优秀的文章!我知道这是一篇旧的文章,但我也遇到了类似于您曾经遇到的问题。我正在使用此wsdl https://clienttesthorizon.horizonafs.com/AFSServices/AFSService.svc?wsdl 但是没有办法生成Java存根文件。请问您能否提供帮助? - Wrapper
听起来你需要指定Jaxb绑定。可以看一下这个问题:https://dev59.com/ymUp5IYBdhLWcg3wvpYM - Cuga
还有这个人:https://dev59.com/vKDha4cB1Zd3GeqP_jHX - Cuga

0
我遇到了相同的问题,我是通过pom.xml调用webservice的。我只是删除了packageName,并定义了一个sourceDestDir。这将在源包中创建存根。我正在从配置中获取wsdlURL。以下是我在pom.xml中所做的更改:
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxws-maven-plugin</artifactId>
        <version>2.6</version>
        <executions>
            <execution>
                <id>wsimport-from-jdk</id>
                <goals>
                    <goal>wsimport</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <args>
                <arg>-B-XautoNameResolution</arg>
            </args>
            <wsdlUrls>
                <wsdlUrl>${service.wsdl.url}</wsdlUrl> 
            </wsdlUrls>
            <keep>true</keep> 
            <sourceDestDir>src/main/java</sourceDestDir>
        </configuration>
    </plugin>

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