- PR -

Axisで、同じ入力メッセージを持つ2つのオペレーション

1
投稿者投稿内容
mikan
ベテラン
会議室デビュー日: 2002/08/19
投稿数: 58
投稿日時: 2008-08-19 10:45
Apache Axis 1.4を使ってWebサービスを作っています。
オペレーションの選択のされ方について質問があります。

まずやりたいこととして、WSDLで2つのオペレーションを定義しています。
2つのオペレーションは、入力メッセージが同じで、出力メッセージは異なります。

コード:
    <operation name="オペレーション1">
        <wsdlsoap:operation style="document" soapAction="action1"/>
        <input name="メッセージA">
            <wsdlsoap:body use="literal"/>
        </input>
        <output name="メッセージB">
            <wsdlsoap:body use="literal"/>
        </output>
    </operation>
    <operation name="オペレーション2">
        <wsdlsoap:operation style="document" soapAction="action2"/>
        <input name="メッセージA">
            <wsdlsoap:body use="literal"/>
        </input>
        <output name="メッセージC">
            <wsdlsoap:body use="literal"/>
        </output>
    </operation>



このとき、クライアントからオペレーション2を呼ぼうとしても、
オペレーション1が呼ばれてしまい、(おそらく)クライアント側で
「Invalid element in %1 - %2」エラーになります。


ささっと検索した程度ですが、
http://otndnld.oracle.co.jp/document/products/as10g/101320/doc_cd/web.1013/B31869-02/interop.htm
引用:
Apache Axisプラットフォームは、操作のルーティングでSOAPActionヘッダーに依存しません。
SOAP Bodyペイロードの最上位要素を使用して一致する操作を検出します。



http://edocs.beasys.co.jp/e-docs/alsb/help30/consolehelp30/consolehelp/wwhelp/wwhimpl/js/html/wwhelp.htm?href=proxyserviceCreateProxyServiceOperationSelectionConfigurationPage.html
引用:
# [SOAP 本体のタイプ ] - WSDL 仕様で定義されたデフォルトのアルゴリズムです。
受信する SOAP メッセージのタイプに基づいて呼び出す操作が計算されます。
(中略)
同じ入力メッセージで 2 つの操作のある WSDL の場合、入力メッセージを調べて
操作をユニークに識別できないため、このアルゴリズムを操作に選択しないでください。



という記述から、この動作は仕様なのだと解釈しました。
(見つけたページがOracleやAquaLogicだっただけで、これらの製品は使用していません。
 実際に使っているのはOpenstandia/AS 2.0.2です)


さて、ここで質問なのですが、このように同じ入力メッセージを持つ
2つのオペレーションを使いたいとき、どのように対応するべきなのでしょうか。

今考えている方法としては、

(1)入力メッセージの名前を違うものにする
(2)操作の選択方法を変更する(たとえばsoapActionによる選択など)
(3)そのほかに常套手法がある?

です。

(1)はWSDLを変更して、可能であることは確認しました。
(しかしWSDLが与えられているトップダウン開発なので、
 できればWSDLの変更は避けたい)

(2)は変更のメリット・デメリットを調べてみます。
特に何か特徴や注意すべき点があれば教えてください。
(あと、変更の仕方もお願いします)

よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)