web-dev-qa-db-ja.com

クラスのカスタマイズを使用して、ファイル生成の競合を解決する方法

Mavenを使用してJAXBファイルを生成してSpringフレームワークで使用しようとしていますが、Mavenは次のエラーを表示します。

名前を持つファイルを生成できないことは理解していますが、問題を解決する方法はわかりません。これまでのところ、次のリンクを訪れました。 12

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>

次のpackage-info.Javaファイルをhello.wsdlパッケージに追加しましたが、役に立ちませんでした。

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

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
13
Daniel Newtown

あなたが直面しているエラーメッセージは基本的に、あなたのwsdlのtypesセクションのいくつかの名前が2回使用されていることを示しています。あなたの場合all<element>tagsは、対応するタイプと同じ名前(<complexType>として定義)を持っています。

例:

  <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>

これは非常にまれです。

これらの問題を解決するには、基本的に2つのオプションがあります。

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の場合、これはSearchFlightsおよびSearchFlights2になります生成されます。

より良い方法は、バインディングファイルを使用してすべての名前の競合を事前に解決することです。バインディングファイルには、主にXPATHexpressionと変換ルールが含まれます。 every宣言名に追加するバインディングファイルは次のとおりです。

<?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>
33
jah

AutoNameResolutionが修正された場合

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

動作しない、試してください:

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

<generatePackage></generatePackage>タグを削除すると、問題が解決します。

ただし、この削除の結果、パッケージはxml名前空間から作成されます。たとえば、名前空間example.com/xyzはパッケージcom.example.xyzになります

10
Hamid Mohayeji

Hamid-mohayejiが言及しているようにgeneratePackageを削除すると、多くのケース(少なくともxsdsが正常な場合)が修正されます。この設定は、すべてのエンティティを同じ名前空間に入れようとしますが、単純な場合を除き、それは間違いを犯します。ただし、パッケージを省略すると、名前空間から作成されたパッケージが残ります。たとえば http://www.co.com/srvc/api/common はパッケージになりますcom.co.srvc.api.common

これは、簡単なバインディングファイルを追加することで解決できます。構成、設定 <bindingDirectory>src/main/resources/bindings</bindingDirectory>をpomに追加し、バインディングファイル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>
3
thoredge