0

我使用带有 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

4

1 回答 1

0

在阅读了 Aegis 源代码后,我帮助自己完成了以下 hack:

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,它就可以工作。不应该有更好的方法吗?

于 2013-11-01T15:33:21.070 回答