0

私は Apache CXF と Aegis データ バインディングを使用して、Java Web サービスを C# クライアントに提供しています。これは原則として非常にうまく機能します。C# 側では、より制限された DataContractSerializer を使用したいと考えています。これは、配列の代わりにコレクションを使用できるためです。DataContractSerializer を使用すると、Aegis で生成された WSDL の複雑さが制限されることを理解しています。これで、継承を使用する Java 型ができました。Aegis は基本型と派生型の両方を含む WSDL を生成できますが、DataContractSerializer はこの WSDL を理解できないようです。SvcUtil は XmlSerializer にフォールバックし、私のコレクションは醜い配列になります。

この問題に対処するための理論的な可能性を想像できます。

  • Aegis での継承サポートをオフにします。これにより、WSDL には派生型のみが含まれ、それぞれにすべての基本型プロパティが含まれます。
  • 何とか DataContractSerializer に WSDL 継承を理解させる
  • どういうわけか、XmlSerializer が配列ではなくコレクションを使用するようにします

最後の 2 つのオプションは不可能だと思うので、最初のオプションで行き詰まっています。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 の以前のバージョンでは拡張機能が生成されなかったようです

4

1 に答える 1

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

}

継承した Bean にこの AegisType を登録すると、機能します。もっと良い方法があるはずではありませんか?

于 2013-11-01T15:33:21.070 に答える