Axis2 WSDL2Java генерирует несколько классов для одного элемента - PullRequest
0 голосов
/ 02 апреля 2019

Я участвую в попытке обновить устаревший проект с использования 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 в первую очередь?

...