2013-11-01 75 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,它就可以工作。 不一定有更好的办法吗?