Ответ 1
Сообщение об ошибке, с которым вы сталкиваетесь, в основном утверждает, что некоторые имена в разделе types
вашего wsdl используются два раза. В вашем случае все теги <element>
имеют то же имя, что и их соответствующие типы (определенные как <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>
Это довольно редко.
Существует два варианта решения этих проблем:
Использовать 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>