关闭CXF Aegis继承支持/使用DataContractSerializer继承?

时间:2013-11-01 14:17:03

标签: c# java web-services cxf aegis

我使用Apache CXF和Aegis数据绑定为C#客户端提供Java Web服务。这在原则上非常有效。在C#方面,我想使用更有限的DataContractSerializer,因为它允许集合而不是数组。我理解使用DataContractSerializer限制了Aegis生成的WSDL的复杂性。现在我有一个使用继承的Java类型。 Aegis能够生成包含基类和派生类型的WSDL,但DataContractSerializer似乎无法理解此WSDL。 SvcUtil回退到XmlSerializer,我的集合得到了丑陋的数组。

我可以想象处理这个问题的理论可能性:

  • 使用Aegis关闭继承支持。这应该导致WSDL仅包含派生类型,包含每个所有基本类型属性。
  • 以某种方式使DataContractSerializer理解WSDL继承
  • 以某种方式使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

1 个答案:

答案 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,它就可以了。 一定不能有更好的方法吗?