我使用带有 Aegis 数据绑定的 Apache CXF 向 C# 客户端提供 Java Web 服务。这原则上非常有效。在 C# 方面,我想使用更有限的 DataContractSerializer,因为它允许集合而不是数组。我了解使用 DataContractSerializer 会限制 Aegis 生成的 WSDL 的复杂性。现在我有一个使用继承的 Java 类型。Aegis 能够生成包含基类型和派生类型的 WSDL,但 DataContractSerializer 似乎无法理解此 WSDL。SvcUtil 回退到 XmlSerializer,我的集合得到了丑陋的数组。
我可以想象你处理这个问题的理论可能性:
- 使用 Aegis 关闭继承支持。这应该导致 WSDL 仅包含派生类型,其中包含每个基本类型属性。
- 不知何故让 DataContractSerializer 理解 WSDL 继承
- 不知何故让 XmlSerializer 使用集合而不是数组
我认为最后两个选项是不可能的,所以我坚持第一个。如何关闭 Aegis 继承?
示例 WSDL 片段:
<xsd:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://tables.basic.meona.de">
<xsd:complexType abstract="true" name="BaseTreeNode">
<xsd:sequence>
<xsd:element minOccurs="0" name="active" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="category" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="name" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="sequenceNumber" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
<xsd:complexType name="EmergencyDiagnosis">
<xsd:complexContent>
<xsd:extension base="ns0:BaseTreeNode">
<xsd:sequence>
<xsd:element minOccurs="0" name="externalCode" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="favoriteDiagnosis" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="identifier" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
似乎以前版本的 Aegis 没有生成扩展,所以我希望可以将其关闭:https ://issues.apache.org/jira/browse/CXF-5176