Отключить поддержку наследования CXF Aegis / Использовать наследование с DataContractSerializer?

Я использую Apache CXF с привязкой данных Aegis для предоставления веб-службы Java клиенту C#. Это работает в принципе очень хорошо. На стороне 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

1 ответ

Прочитав исходный код 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 для своих унаследованных компонентов, он будет работать. Не должно ли быть лучшего способа?

Другие вопросы по тегам