2013-11-01 10 views
0

Я использую Apache CXF с привязкой данных Aegis для предоставления веб-службы Java клиенту C#. Это работает в принципе очень хорошо. На стороне C# я хотел бы использовать более ограниченный DataContractSerializer, потому что он позволяет создавать коллекции вместо массивов. Я понимаю, что использование DataContractSerializer ограничивает сложность WSDL, созданного Aegis. Теперь у меня есть тип Java, который использует наследование. Aegis может генерировать WSDL, который содержит как базовый, так и производный тип, но DataContractSerializer, похоже, не способен понять этот WSDL. SvcUtil возвращается к XmlSerializer, и мои коллекции получают уродливые массивы.Отключите поддержку CXF Aegis Inheritance/Use Inheritance с DataContractSerializer?

Я могу представить тебя теоретические возможности для решения этой проблемы:

  • Отключение поддержки наследования с 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

+0

Попробуйте добавить '/ ct: System.Collections.Generic.List'1' переключатель в команду svcutil для генерации списков <> коллекций вместо массивов –

+0

Большое спасибо за ваш совет. К сожалению, это не сработает - SvcUtil все еще возвращается к XmlSerializer, который затем генерирует массивы. Если я удалю унаследованный тип из WSDL (оставив все мои другие типы массива/коллекции без изменений на месте), он будет работать. –

ответ

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; 
    } 

} 

Если зарегистрировать этот AegisType для моих унаследованных бобы, это работает. Не должен ли быть лучший способ?