Axis2 WSDL2Java为同一元素生成多个类

时间:2019-04-02 07:52:04

标签: java axis2 wsdl2java

我参与了将旧项目从使用Axis2 1.3升级到使用Axis2 1.7.9的尝试。由于某种原因,我无法弄清楚WSDL​​2Java是否为匿名类型生成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个用于Context的Java类。 Context_type0和Context_type1。似乎Context.java和Controller_IType.java都仅使用Context_type1。 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的一部分。当我为我的真实项目生成时,为Controller_IType选择Context_type0,为Context选择Context_type1。同事生成时,它为Controller_IType和上下文选择Context_type1。

为什么它首先会生成两个不同的Context_typex?

0 个答案:

没有答案