我使用Apache CXF和Aegis数据绑定为C#客户端提供Java Web服务。这在原则上非常有效。在C#方面,我想使用更有限的DataContractSerializer,因为它允许集合而不是数组。我理解使用DataContractSerializer限制了Aegis生成的WSDL的复杂性。现在我有一个使用继承的Java类型。 Aegis能够生成包含基类和派生类型的WSDL,但DataContractSerializer似乎无法理解此WSDL。 SvcUtil回退到XmlSerializer,我的集合得到了丑陋的数组。
我可以想象处理这个问题的理论可能性:
我认为最后两个选项是不可能的,所以我坚持第一个。我怎样才能关闭宙斯盾遗产?
示例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
答案 0 :(得分:0)
在阅读了Aegis源代码后,我帮助自己解决了以下问题:
public class AegisNonExtensionBeanType extends BeanType {
@Override
public BeanTypeInfo getTypeInfo() {
BeanTypeInfo bti = super.getTypeInfo();
bti.setExtension(false);
bti.setExtensibleAttributes(false);
bti.setExtensibleElements(false);
return bti;
}
@Override
public AegisType getSuperType() {
return null;
}
}
如果我为继承的bean注册了这个AegisType,它就可以了。 一定不能有更好的方法吗?