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