假设我们有一个使用 WSDL 复杂类型扩展的 Web 服务。考虑下面的(有效的 WSDL)示例,其中Vechicle
是抽象的。两种类型,Car
和Bike
,从它继承:
<xs:complexType name="Vehicle" abstract="true">
<xs:sequence>
<xs:element name="common1" type="xs:string" minOccurs="0"/>
<xs:element name="common2" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Car">
<xs:complexContent>
<xs:extension base="tns:Vehicle">
<xs:sequence>
<xs:element name="carValue1" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
<xs:complexType name="Bike">
<xs:complexContent>
<xs:extension base="tns:Vehicle">
<xs:sequence>
<xs:element name="bikeValue1" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
以及Transport
使用该Vehicle
类型作为其元素之一的类型:
<xs:complexType name="Transport">
<xs:sequence>
<xs:choice>
<xs:element ref="tns:Car"/>
<xs:element ref="tns:Bike"/>
</xs:choice>
<xs:element name="description" type="xs:string"/>
</xs:sequence>
</xs:complexType>
请注意,Vehicle
它本身不是内部可能的类型Transport
,这当然是因为Vehicle
它是抽象的。在 Java Metro 堆栈中很容易生成上述内容。Blaise Doughan 的博客在这里给了我一些宝贵的意见。
我的问题是这将如何在 Web 服务互操作性方面发挥作用,特别是与WS-I Basic Profile相关。我可以确定符合 WS-I 的 Web 服务框架能够使用这样的 Web 服务吗?. 我知道 WS-I 基本上只指定了 WSDL 中允许的内容的一个子集。我已经尝试阅读 WS-I 规范来理解这个问题,但没有真正的运气。语言对我来说太难了。我发现一篇 2004 年的文章引起了一些担忧:
这种关注的基本原因是值对象继承的扩展机制的使用超出了 WS-I 基本配置文件,尽管它没有明确排除在外。目前,没有提到在 WS-I 基本概要文件中使用扩展构造,此外,WS-I 合规性测试套件也没有涵盖这种情况。
...但那是在 2004 年,显然与 WS-I Basic Profile v1.0 有关。从那时起,WS-I Basic profile 1.1、1.2 和 2.0 规范已经发布。
所以问题是:使用 WSDL 值类型扩展特性(即<xs:complexType name="xxx" abstract="true">
和<xs:extension base="xxx">
)的 Web 服务是否可以在所有声称符合WS-I Basic Profile 的框架中工作?他们可以使用这样的网络服务吗?