【问题标题】:How to use a class customization to resolve file generating conflicts如何使用类自定义来解决文件生成冲突
【发布时间】:2016-01-31 00:35:45
【问题描述】:

我正在尝试使用 Maven 生成供 Spring 框架使用的 JAXB 文件,但 Maven 显示以下错误:

我了解它无法生成具有名称的文件,但我不确定如何解决该问题。到目前为止,我访问了以下链接。 123

org.xml.sax.SAXParseException; systemId: http://www5v80.elsyarres.net/service.asmx?wsdl; lineNumber: 5; columnNumber: 39; A class/interface with the same name "hello.wsdl.SearchFlights" is already in use. Use a class customization to resolve this conflict.
....
org.xml.sax.SAXParseException; systemId: http://www5v80.elsyarres.net/service.asmx?wsdl; lineNumber: 12; columnNumber: 43; (Relevant to above error) another "SearchFlights" is generated from here.
....
org.xml.sax.SAXParseException; systemId: http://www5v80.elsyarres.net/service.asmx?wsdl; lineNumber: 371; columnNumber: 42; A class/interface with the same name "hello.wsdl.GetFlightDetails" is already in use. Use a class customization to resolve this conflict.
....

Maven 插件

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <version>0.12.3</version>
        <executions>
            <execution>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <schemaLanguage>WSDL</schemaLanguage>
            <generatePackage>hello.wsdl</generatePackage>
            <schemas>
                <schema>
                    <url>http://www5v80.elsyarres.net/service.asmx?wsdl</url>
                </schema>
            </schemas>
        </configuration>
    </plugin>

我在hello.wsdl 包中添加了以下package-info.java 文件,但没有帮助。

@XmlSchema( 
    namespace = "ElsyArres.API",
    elementFormDefault = XmlNsForm.QUALIFIED) 
package hello.wsdl;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

【问题讨论】:

  • 你能解决这个问题吗?如果是,如何?我也面临类似的问题,我不想继续使用&lt;arg&gt;-XautoNameResolution&lt;/arg&gt; 选项。我对绑定方法很感兴趣。

标签: java spring maven jaxb wsdl


【解决方案1】:

如果 autoNameResolution 修复了

 <args>
     <arg>-XautoNameResolution</arg>
 </args>

不行,试试:

 <args>
     <arg>-B-XautoNameResolution</arg>
 </args>

【讨论】:

  • 谢谢,这也适用于 jdk 的 wsimport 实用程序
【解决方案2】:

您面临的错误消息基本上表明您使用了两次 wsdl 的 types部分中的某些名称。在您的情况下,all &lt;element&gt;tags 与其对应的类型具有相同的名称(定义为 &lt;complexType&gt;)。

示例:

  <s:element name="SearchFlights">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="SoapMessage" type="tns:SearchFlights" />
      </s:sequence>
    </s:complexType>
  </s:element>

  <s:complexType name="SearchFlights">
    <s:complexContent mixed="false">
      <s:extension base="tns:SoapMessageBase">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="Request" type="tns:SearchFlightsRequest" />
          <s:element minOccurs="0" maxOccurs="1" name="Response" type="tns:SearchFlightsResponse" />
        </s:sequence>
      </s:extension>
    </s:complexContent>
  </s:complexType>

这很不常见。

解决这些问题基本上有两种选择:

使用 autoNameResolution

 <plugin>
     <groupId>org.jvnet.jaxb2.maven2</groupId>
     <artifactId>maven-jaxb2-plugin</artifactId>
     <version>0.13.1</version>
     <executions>
         <execution>
             <goals>
                 <goal>generate</goal>
             </goals>
         </execution>
     </executions>
     <configuration>

         <args>
             <arg>-XautoNameResolution</arg>
         </args>

         <schemaLanguage>WSDL</schemaLanguage>
         <generatePackage>hello.wsdl</generatePackage>
         <schemas>
             <schema>
                 <url>http://www5v80.elsyarres.net/service.asmx?wsdl</url>
             </schema>
          </schemas>
      </configuration>
  </plugin>

插件将通过在每个冲突名称后附加数字来解决所有命名冲突。在上述 SearchFlights 的情况下,这将导致生成 SearchFlightsSearchFlights2

更好的方法是使用绑定文件提前解决所有名称冲突。绑定文件大多包含XPATHexpression 和转换规则。 附加到 每个 声明名称的绑定文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings wsdlLocation="http://www5v80.elsyarres.net/service.asmx?wsdl"
            xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
            xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='ElsyArres.API']">
        <jaxb:schemaBindings>
            <jaxb:nameXmlTransform>
                <jaxb:elementName suffix="Elem"/>
            </jaxb:nameXmlTransform>
        </jaxb:schemaBindings>
    </jaxws:bindings>
</jaxws:bindings>

jaxb:nameXmlTransform 还有其他选项,例如后缀和附加到其他类型的 xml 元素(例如类型)。

遗憾的是,我无法使用 org.jvnet.jaxb2.maven2:maven-jaxb2-plugin 处理这个绑定文件(但我确信有一个有效的配置)

它仍然适用于org.codehaus.mojo:jaxws-maven-plugin 和以下配置。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.4.1</version>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <bindingFiles>
         <bindingFile>${basedir}/src/main/resources/bindings.xjb</bindingFile>
        </bindingFiles>
        <wsdlUrls>
            <wsdlUrl>http://www5v80.elsyarres.net/service.asmx?wsdl</wsdlUrl>
        </wsdlUrls>
        <vmArgs>
            <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
        </vmArgs>
    </configuration>
</plugin>

【讨论】:

  • 我对绑定方法很感兴趣。你能和org.jvnet.jaxb2.maven2:maven-jaxb2-plugin一起工作吗??
  • &lt;arg&gt;-XautoNameResolution&lt;/arg&gt; 有效,但现在我收到错误Two declarations cause a collision in the ObjectFactory class. 有什么建议吗??
  • 我使用了-XautoNameResolution解决方案,完美解决了问题。感谢您的解决方案!花了一天时间。
【解决方案3】:

删除&lt;generatePackage&gt;&lt;/generatePackage&gt; 标签解决了这个问题。

但是,此删除的结果是您的包将从 xml 命名空间创建。例如命名空间example.com/xyz 将导致包com.example.xyz

【讨论】:

  • 这似乎是最简单的解决方案。似乎对我有用。我想知道缺点是什么。
  • 正是,在花费大量时间能够生成源之后,想知道它的缺点。
【解决方案4】:

xsd 到 jaxb 和使用 org.codehaus.mojo 的 jaxb2-maven-plugin 时,我遇到了同样的问题。配置下有一个packageName在同一个包下创建所有生成的文件导致问题

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outputDirectory>target/generated-sources/jaxb</outputDirectory>
        <schemaDirectory>src/main/xsd</schemaDirectory>
        <schemaFiles>test.xsd</schemaFiles>
        <!-- <packageName>com.example.myschema</packageName> -->
    </configuration>
</plugin>

【讨论】:

    【解决方案5】:

    删除 generatePackage 作为 hamid-mohayeji 提到修复了很多情况(至少在你的 xsd 是理智的情况下)。该设置试图将所有实体放入同一个命名空间,这在非简单情况下必然会出错。但是,省略包会留下从命名空间创建的包。例如,http://www.co.com/srvc/api/common 将成为包 com.co.srvc.api.common

    这可以通过添加一个简单的绑定文件来解决。在pom中配置&lt;bindingDirectory&gt;src/main/resources/bindings&lt;/bindingDirectory&gt;,在绑定目录下添加绑定文件something.xjb。这里需要引用个人相对于这个文件。

    此文件为每个 xsd 文件单独设置包:

    <?xml version="1.0" encoding="UTF-8"?>
    <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0">
    
        <jaxb:bindings schemaLocation="../schemas/common.xsd">
            <jaxb:schemaBindings>
                <jaxb:package name="com.mycomp.myapp.co.common" />
            </jaxb:schemaBindings>
        </jaxb:bindings>
    
        ... more bindings
    
    </jaxb:bindings>
    

    【讨论】:

      【解决方案6】:

      以上所有答案都没有奏效...

      但是这个:

      <configuration>
        <defaultOptions>
          <autoNameResolution>true</autoNameResolution>
        </defaultOptions>
      </configuration>
      

      【讨论】:

        【解决方案7】:

        当你使用时

        jaxws-maven-plugin
        

        从 WSDL 生成类的 maven 插件使用以下参数来解决此问题。

        <execution>
         <configuration>
            <xjcArgs>
                <xjcArg>-XautoNameResolution</xjcArg>
            </xjcArgs>
         </configuration>
        </execution>
        

        【讨论】:

          【解决方案8】:
           <defaultOptions>
                  <autoNameResolution>true</autoNameResolution>
          </defaultOptions>
          

          这对我来说适用于 Apache CXF 插件。

          【讨论】:

            猜你喜欢
            • 2019-07-05
            • 2015-09-23
            • 1970-01-01
            • 1970-01-01
            • 2014-09-17
            • 1970-01-01
            • 1970-01-01
            • 2012-09-25
            • 2017-09-14
            相关资源
            最近更新 更多