簡體   English   中英

關閉CXF Aegis繼承支持/將繼承與DataContractSerializer一起使用?

[英]Turn off CXF Aegis Inheritance support / Use Inheritance with DataContractSerializer?

我將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

閱讀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,它將起作用。 難道沒有更好的辦法嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM