복붙노트

[SPRING] 클래스 사용자 정의를 사용하여 파일 생성 충돌을 해결하는 방법

SPRING

클래스 사용자 정의를 사용하여 파일 생성 충돌을 해결하는 방법

Spring 프레임 워크에서 사용할 JAXB 파일을 생성하기 위해 Maven을 사용하려하지만 Maven은 다음과 같은 오류를 표시합니다.

이름이있는 파일을 생성 할 수 없다는 것을 알고 있지만 문제를 해결하는 방법을 모르겠습니다. 지금까지 나는 다음 링크를 방문했다. 1, 2, 3

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

메이븐 플러그인

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

해결법

  1. ==============================

    1.기본적으로 직면하고있는 오류 메시지는 wsdl의 typessection에있는 몇 가지 이름이 두 번 사용되었다고 말합니다. 귀하의 경우 모든 태그는 해당 유형 (으로 정의 됨)과 동일한 이름을 갖습니다.

    기본적으로 직면하고있는 오류 메시지는 wsdl의 typessection에있는 몇 가지 이름이 두 번 사용되었다고 말합니다. 귀하의 경우 모든 태그는 해당 유형 (으로 정의 됨)과 동일한 이름을 갖습니다.

    예:

      <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의 경우 SearchFlights 및 SearchFlights2가 생성됩니다.

    더 좋은 방법은 바인딩 파일을 사용하여 모든 이름 충돌을 미리 해결하는 것입니다. 바인딩 파일은 대부분 XPATH 표현식과 변환 규칙을 포함합니다. 모든 선언 이름에 추가하는 바인딩 파일은 다음과 같습니다.

    <?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>
    
  2. ==============================

    2.autoNameResolution이 수정되면

    autoNameResolution이 수정되면

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

    작동하지 않으면 시도하십시오.

     <args>
         <arg>-B-XautoNameResolution</arg>
     </args>
    
  3. ==============================

    3. 태그를 제거하면 내 문제가 해결되었습니다.

    태그를 제거하면 내 문제가 해결되었습니다.

  4. from https://stackoverflow.com/questions/35108965/how-to-use-a-class-customization-to-resolve-file-generating-conflicts by cc-by-sa and MIT license