Я участвую в попытке обновить устаревший проект с использования Axis2 1.3 до использования Axis2 1.7.9.По какой-то причине я не могу понять, что WSDL2Java генерирует 2 класса для анонимного типа.Я создал минимальный пример, показывающий поведение:
Collector.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="http://ns.org/model/" xmlns:f="http://ns.org/model/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2001/XMLSchema">
<import namespace="http://ns.dk/model/"
location="Controller.wsdl"/>
<binding name="ControllerBinding" type="f:ControllerServicePortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="getController">
<soap:operation soapAction="" style="document"/>
<input><soap:body use="literal"/></input>
<output><soap:body use="literal"/></output>
</operation>
</binding>
<service name="Controller">
<port name="Controllerport" binding="f:ControllerBinding">
<soap:address location="http://localhost:80/axis2/services/Controller"/>
</port>
</service>
</definitions>
Controller.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="http://ns.org/model/" name="ControllerService" xmlns:f="http://ns.org/model/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2001/XMLSchema">
<types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns.org/model/">
<xsd:include schemaLocation="ControllerInterface.xsd"/>
</xsd:schema>
</types>
<message name="ControllerServiceRequest">
<part name="Request" element="f:Controller_I"/>
</message>
<message name="ControllerServiceResponse">
<part name="Response" element="f:Controller_I"/>
</message>
<portType name="ControllerServicePortType">
<operation name="getController">
<input message="f:ControllerServiceRequest"/>
<output message="f:ControllerServiceResponse"/>
</operation>
</portType>
ControllerInterface.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns.org/model/" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0" xmlns:f="http://ns.org/model/">
<xs:include schemaLocation="Controller_IType.xsd"/>
</xs:schema>
Controller_IType.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns.org/model/" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0" xmlns:f="http://ns.org/model/">
<xs:element name="Controller_I" type="f:Controller_IType"/>
<xs:complexType name="Controller_IType">
<xs:sequence>
<xs:element minOccurs="0" ref="f:Context" />
</xs:sequence>
</xs:complexType>
<xs:element name="Contekst">
<xs:simpleType>
<xs:restriction base="xs:boolean">
<xs:pattern value="true"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
При выполнении следующей команды:
java -classpath [axis-path] org.apache.axis2.wsdl.WSDL2Java -o generated --databinding-method adb -noBuildXML --server-side --generate-all --unpack-classes -uw --service-description -uri Collector.wsdl
Я получаю 2 Java-класса дляКонтекст.Context_type0 и Context_type1.Кажется, что только Context_type1 используется и Context.java и Controller_IType.java.И классы Java идентичны, за исключением суффиксов 0 и 1 в имени типа.
Если я изменю Context на именованный тип, вместо этого, например так:
<xs:simpleType name="ContextType">
<xs:restriction base="xs:boolean">
<xs:pattern value="true"/>
</xs:restriction>
</xs:simpleType>
и изменим использованиевместо ссылки на тип:
<xs:element minOccurs="0" name="Context" type="f:ContextType" />
генерируется только ContextType.java.
Если я изменю элемент на встроенный, как это:
<xs:element minOccurs="0" name="Context">
<xs:simpleType>
<xs:restriction base="xs:boolean">
<xs:pattern value="true"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Это будетвсе еще генерирует Context_type0 и Context_type1, но не генерирует Context.java.
Генерация с помощью Axis2 1.3 будет только когда-либо создавать Context_type0.Но генерация с Axis2 1.4 показывает проблему, и она все еще присутствует в 1.7.9.
Реальная проблема заключается в том, что я не могу понять, как он выбирает, какой из 2 Context_typex использовать как часть Controller_IType.Когда я генерирую для своего реального проекта, он выбирает Context_type0 для Controller_IType и Context_type1 для Context.Когда коллега генерирует, он выбирает Context_type1 для Controller_IType и для Context.
Почему он вообще генерирует 2 разных Context_typex в первую очередь?