2013-11-01 96 views
0

我使用Apache CXF和Aegis數據綁定爲C#客戶端提供Java Web服務。原則上這很有效。在C#方面,我想使用更有限的DataContractSerializer,因爲它允許集合而不是數組。我明白使用DataContractSerializer會限制Aegis生成的WSDL的複雜性。現在我有一個使用繼承的Java類型。 Aegis能夠生成包含基本類型和派生類型的WSDL,但DataContractSerializer似乎無法理解此WSDL。 SvcUtil退回到XmlSerializer,並且我的集合獲得了難看的數組。關閉CXF Aegis繼承支持/使用繼承與DataContractSerializer?

我能想象你的理論可能性來解決這個問題:

  • 關閉繼承支持,庇護。這應該會導致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> 

看來宙斯盾以前的版本中並沒有產生擴展,所以我希望它可以被關閉:https://issues.apache.org/jira/browse/CXF-5176

+0

嘗試在您的svcutil命令中添加'/ ct:System.Collections.Generic.List'1'開關來生成List <>集合,而不是陣列 –

+0

非常感謝您的提示。不幸的是,這不起作用 - SvcUtil仍然回退到XmlSerializer,然後生成數組。如果我從WSDL中刪除繼承的類型(將所有其他數組/集合類型保持不變),它就可以工作。 –

回答

0

閱讀宙斯盾源代碼後,我通過以下攻擊幫助自己:

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,它就可以工作。 不一定有更好的辦法嗎?