我参与了将旧项目从使用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个用于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?