1

出力メッセージの選択に関する Webservice インターフェイスの下位互換性について質問があります。それに対する答えは本当に見つかりませんでした。

次の応答メッセージを持つ操作 "getData" を持つ Web サービスがあるとします (これは Web サービスの V1 です)。応答メッセージには、"Instruction" または "KeyTranslation" のペイロードを返す Choice 要素が含まれています。この V1 WSDL は、Java バインディングを生成し、本番環境でアプリケーションをロールアウトするさまざまなコンシューマーによって使用されます。

<xsd:complexType name="GetInstructionListResponse">
    <xsd:sequence>
        <xsd:element name="ContinueInfo" type="tns:ContinueInfo" form="qualified" />
        <xsd:element name="ResultLength" type="xsd:integer" form="qualified" />
        <xsd:element name="Payload">
          <xsd:complexType>
            <xsd:choice>
                <xsd:element name="DataObjectList1" type="tns:Instruction" form="qualified" minOccurs="1" maxOccurs="50" />
                <xsd:element name="DataObjectList2" type="tns:KeyTranslation" form="qualified" minOccurs="1" maxOccurs="50" />
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="ReturnCodeList" type="tns:ReturnCodeList" form="qualified" minOccurs="0">
            <xsd:annotation>
                <xsd:documentation>Description: List of error descriptions</xsd:documentation>
            </xsd:annotation>
        </xsd:element>
    </xsd:sequence>
</xsd:complexType>

このインターフェイスのプロバイダーとして、V1 のロールアウト後に 3 番目の選択要素である「Advise」を導入します。

    <xsd:complexType name="GetInstructionListResponse">
    <xsd:sequence>
        <xsd:element name="ContinueInfo" type="tns:ContinueInfo" form="qualified" />
        <xsd:element name="ResultLength" type="xsd:integer" form="qualified" />
        <xsd:element name="Payload">
          <xsd:complexType>
            <xsd:choice>
                <xsd:element name="DataObjectList1" type="tns:Instruction" form="qualified" minOccurs="1" maxOccurs="50" />
                <xsd:element name="DataObjectList2" type="tns:KeyTranslation" form="qualified" minOccurs="1" maxOccurs="50" />
                <xsd:element name="DataObjectList2" type="tns:Advice" form="qualified" minOccurs="1" maxOccurs="50" />
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="ReturnCodeList" type="tns:ReturnCodeList" form="qualified" minOccurs="0">
            <xsd:annotation>
                <xsd:documentation>Description: List of error descriptions</xsd:documentation>
            </xsd:annotation>
        </xsd:element>
    </xsd:sequence>
</xsd:complexType>

問題は、出力メッセージのこの変更は破壊的変更ですか、つまり、既存のコンシューマー (新しい選択要素を必要としない V1 で作業している) は何かをする必要がありますか? ) プロバイダーとして、V1 WSDL プロバイダー インターフェイスをこの拡張された応答構造に置き換える場合、または処理で 3 番目の選択要素を必要としない限り、それは彼にとって透過的でしょうか?

4

2 に答える 2

1

厳密に言えば、これを重大な変更と呼びます。「厳密」とは、変更前に動作し、変更後に壊れるプログラムを作成できることを意味します。変更前は元の 2 つの選択肢のいずれかを受け取っていたプログラムが、現在は 3 番目の選択肢を受け取ることになり、このプログラムは機能しなくなります。

さらに、WSDL を読み取ることができるすべてのプログラムは、WSDL が変更されたことを認識します。このようなプログラムは、WSDL が変更された場合に「中断」することが合理的に許可される可能性があります。

wsdl2java や Visual Studio の「サービス参照の追加」などのツールを使用する場合、コードは WSDL から作成されることに注意してください。WSDL を変更すると、生成されるコードが変更されます。知らないうちに誰かのコードを変更している可能性があることを軽視しないでください。

于 2013-05-01T01:23:18.117 に答える
0

その間、私はテスト ベッド (Eclipse、ApacheV6、Axis2) をセットアップし、テストを実行していました。

  • サーバーの V1 の WSDL Java バインディングを使用していたクライアントを持つ (2 つの選択要素)
  • 3 つの選択肢を持つ WSDL V2 実装でサーバーを実行する。
  • 結果: Java クライアントは引き続き接続でき、V2 サーバーから 2 つの選択要素の正しい結果を取得できます (マーシャリングの問題はなく、再コンパイルは必要ありません)。
于 2013-04-30T23:23:38.693 に答える